【不同的二叉搜索树】

给定一个整数 n,生成所有由 n 个不同节点组成且节点值从 1 到 n 的二叉搜索树。本文介绍了动态规划的解决思路和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同的二叉搜索树 II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:
在这里插入图片描述

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:
输入:n = 1
输出:[[1]]

提示:
1 <= n <= 8

思路

二叉搜索树的特点是:右节点>根节点>左节点,所以在构造二叉搜索树时,确定根节点的值rootVal以后就会将整个序列分割为两部分,小于rootVal的都在左子树,大于rootVal的都在右子树。于是原本的问题就变成了两个子问题:

  1. 构造长度为rootVal-1的二叉搜索树;
  2. 构造长度为n-rootVal的二叉搜索树,其所有节点的值都偏移rootVal。

这里需要明确的一点是,我们找的是二叉树的结构,当仅有值偏移时,相同长度的二叉搜索树的结构是完全相同的。
显然,采用DP算法,并且用一个数组储存n之前长度的所有二叉搜索树,使用时直接调用。

class Solution {
   
    public List<TreeNode> generateTrees(int n) {
   
        List<TreeNode>[] dp=new ArrayList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值