leetCode 95. Unique Binary Search Trees II(独特的二叉搜索树II)

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧) 本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。 阅读详情

Given an integer n, generate all structurally unique BST’s (binary search trees) that store values 1 … n.

Example:

Input: 3
Output:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST’s shown below:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

这道题是96题的变体,问从1到n的数能组成多少种BST,并且输出具体的BST

96题只需要知道有多少种情况,所以用dp解决,只需要知道选择root的左子树有多少个节点,右子树有多少个节点。

而这道题只知道左子树右子树有多少个节点还不行,还需要知道具体的排列方式,但是还是可以沿用96的思路,就是选一个root,拆分左子树和右子树

方法一(递归):
从1到n的数从左到右选一个作root,然后左边的部分用来构成左子树,右边部分构成右子树
递归:
左子树中选一个作root,拆分左子树和右子树
右子树中选一个作root,拆分左子树和右子树

结束条件:
start点 > end点
比如
[1,2,3] 选1作root,1的index是0
index 0左边部分就是(0, index-1)即(0, 0-1), 右边是(index+1, 1)即(0+1,2)
可以看到左边start是0 > end的-1,所以返回空

左右子树都是空的时候,也就是只有一个节点的时候,把这个节点作root返回

左右都不是空,就是前面的BST的个数=左子树个数 * 右子树个数
所以左子树每一种情况都要遍历右子树所有的情况

代码:

    public List<TreeNode> generateTrees(int n) {  
        //一定要单独处理,不然会返回一个二维的空list,而不是一维了     
        if(n < 1) {    
            return new ArrayList<>();
        }
        return generateTrees(1, n);
    }
    
    public List<TreeNode> generateTrees(int l, int r) {
        List<TreeNode> result = new ArrayList<>();
        
        if(l > r) {
            result.add(null); //一定要add null
            return result;
        }
       
        for(int i = l; i <= r; i++) {
            for(TreeNode left : generateTrees(l, i - 1)) {
                for(TreeNode right : generateTrees(i + 1, r)) {
                    TreeNode root = new TreeNode(i);
                    root.left = left;
                    root.right = right;
                    result.add(root);
                }
            }
        }
        return result;
    }

方法二(DP):
参考链接中的DP方法,加上一些理解:

长度为n+1的DP数组,其中dp[i] 表示1~i 所有的unique BST, 即记住1 ~ n的所有BST
那么dp[i]应该是保存BST的list
选中一个i, 遍历0到 i 的每个点 j ,取j + 1为root,root左边的 j 个元素组成的BST构成左子树,即左子树为dp[ j ]中的所有元素,j+1到 i 的 i - j - 1个元素构成右子树,可用dp[i - j - 1]的BST的结构表示右子树,只能用结构,什么意思
比如1,2, 3, 4, 5,取 3 为root,左边的1,2组成的BST为左子树,那么两个元素组成BST的结构就已经确定了,右边4,5构成的BST的结构和1,2构成的BST结构是一样的,只是值不同而已
这里root = j + 1 = 3, 左子树为dp[2], 右子树的结构也为dp[2], 即dp[i - j - 1] = dp[5 - 2 - 1] = dp[2], 但是需要调整一下值,即把1,2改为4,5,可以看到1,2 + (root处的j+1即3)即为4,5
这样可以保存1~i 构成的所有BST,最后返回dp[n]即可

    public List<TreeNode> generateTrees(int n) {
        if(n < 1) {
            return new ArrayList<TreeNode>();
        }
        
        List<TreeNode>[] dp = new List[n+1];
        dp[0] = new ArrayList<TreeNode>();
        dp[0].add(null);
        
        for(int i = 1; i <= n; i++) {
            dp[i] = new ArrayList<TreeNode>();
            for(int j = 0; j < i; j++) {
                for(TreeNode left : dp[j]) {
                    for(TreeNode right : dp[i - j - 1]) {
                        TreeNode root = new TreeNode(j+1);
                        root.left = left;   
                        root.right = addVal(right, j+1);
                        dp[i].add(root);
                    }
                }
            }
        }
        
        return dp[n];
    }
    
    public TreeNode addVal(TreeNode rt, int val) {
        if(rt == null) {
            return null;
        }
        
        TreeNode root = new TreeNode(rt.val + val);
        root.left = addVal(rt.left, val);
        root.right = addVal(rt.right, val);
        
        return root;
    }

联想96题:给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
也是DP,只是不需要具体的BST,只需要数量,用DP数组保存数量,dp[i]也是表示从1到i 有多少种,
然后j 从0遍历到i,以j+1为root,dp[j] 为左子树种数,dp[i - j - 1]为右子树种树,dp[i ] += dp[j ] * dp[i - j - 1]

    public int numTrees(int n) {
        if(n < 1) {
            return 0;
        }

        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;

        for(int i = 2; i <= n; i++) {
            for(int j = 0; j < i; j++) {
                dp[i] += dp[j] * dp[i - j - 1];
            }
        }

        return dp[n];
    }
【物联网】基于LORA组网的远程环境监测系统设计(ThingsCloud云平台版)_资料编号34 实现一主多从的LORA组网远程通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数据并通过各自的 LoRa组网将数据发送给主机。 阅读详情

相关推荐

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

Unique Binary Search Trees II -- leetcode

iven n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example, Given n = 3, your program should return all 5 unique BST's shown below. 1 3

elton_xiao的专栏 669

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC(Internet Protocol Camera,网络摄像头),它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输,接受网络监控主机(NVR或监控管理平台)的管理。IPC可与路由器、交换机、NVR等设备组建成为监控系统。

学无止境,Fighting! 1万+

LeetCode-95. Unique Binary Search Trees II

题目描述(中等难度) 给一个 n,用1…n 这些数字生成所有可能的二分查找树。所谓二分查找树,定义如下: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值相等的节点。 解法一 递归 我们可以利用一下查找二叉树的性质。左子树的所有值小于根节点,右子树的所有值...

猫敷雪 404

Vivado 18.3安装全攻略:从下载到配置的完整指南

本文详细介绍了Vivado 18.3的安装全流程,从下载准备到配置优化,特别适合FPGA开发者。文章包含硬件要求、版本选择、组件配置等实用技巧,帮助用户避免常见安装问题,确保稳定运行。重点解析了License配置和系统优化设置,提升开发效率。

weixin_28331555的博客 568

RU.EXE实用指南:从基础操作到高级调试技巧

本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排查,并强调了安全操作的重要性。

weixin_29228203的博客 283

Unique Binary Search Trees II

Subsets dfs

weixin_44912492的博客 199

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

[Leetcode] 95. Unique Binary Search Trees II 解题报告

题目: Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example, Given n = 3, your program should return all 5 unique BST's shown bel

魔豆(Magicbean)的博客 1611

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2215

数据本体论如何指导数仓建模?

数据本体论指导数仓建模的核心在于构建业务语义与数据结构的桥梁。该方法从业务域中抽象标准化知识体系,包含核心概念、属性、关系和规则五大要素,并将其映射为分层数仓模型。通过"业务本体梳理→本体建模→模型映射→治理迭代"的流程,实现数仓从"结构存储"到"语义载体"的升级。相比传统建模,该方法能解决语义不一致、跨域融合难等问题,使数仓具备更好的可扩展性和业务对齐性。实践表明,以数据本体论为指导的数仓建模能显著提升数据资产的可理解性和复用价值。

石榴姐yyds 396

Leetcode 95 Unique Binary Search Trees II

给出n,生成所有存储1-n共n个数的结构上不重复的二叉查找树。

(ง •̀_•́)ง 589

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1056

LeetCode 95. Unique Binary Search Trees II

Description https://leetcode.com/problems/unique-binary-search-trees-ii/ 给定n,生成所有结构上唯一的二叉搜索树,并返回所有这些树的root。 Solving Ideas 与Unique Binary Search Trees类似,不同的是,这里需要构造出所有结构上唯一的BST 实现起来比较简单就是使用 递归 的方法,遍历所有...

wylu 318

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LeetCode95. Unique Binary Search Trees II

所有可能的BST

grllery的博客 463

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

leetcode 95. Unique Binary Search Trees II | 96. Unique Binary Search Trees

95. Unique Binary Search Trees II https://leetcode.com/problems/unique-binary-search-trees-ii/ 题解 题是好题,可惜我自己想不出来,后来偷看了答案。 难点在于在何处进行 list.add(root);,以及在修改树的形状时候,如何实现所谓的“深拷贝”,而不让树与树之间相互影响。 /** * Definition for a binary tree node. * public class TreeNode {

寒泉 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

95 - Unique Binary Search Trees II

095 - Unique Binary Search Trees II

uso的博客 205

[leetcode]95,96 Unique Binary Search Trees I&II

详解 public int numTrees(int n) { int [] G = new int[n+1]; G[0] = G[1] = 1; for(int i=2; i<=n; ++i) { for(int j=1; j<=i; ++j) { G[i] += G[j-1] * G[i-j]; } } ...

Belle_Chou的博客 151

95. Unique Binary Search Trees II

为节点所组成的二叉搜索树。

qq_40844444的博客 641

96. Unique Binary Search Trees && 95. Unique Binary Search Trees II(DP)

96. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example: Input: 3 Output: 5 Explanation: Given n = 3, there are a total ...

shulixu的博客 1469

( Leetcode 95 ) Unique Binary Search Trees II

题目:Unique Binary Search Trees II Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example, Given n = 3, your program should return

willduan的博客 6567

95. Unique Binary Search Trees II**

95. Unique Binary Search Trees II** https://leetcode.com/problems/unique-binary-search-trees-ii/ 题目描述 Given an integer n, generate all structurally unique BST’s (binary search trees) that store values...

珍妮的选择的博客 429

【LeetCode】 95. Unique Binary Search Trees II 不同的二叉搜索树 II(Medium)(JAVA)

【LeetCode】 95. Unique Binary Search Trees II 不同的二叉搜索树 II(Medium)(JAVA) 题目地址: https://leetcode.com/problems/unique-binary-search-trees-ii/ 题目描述: Given an integer n, generate all structurally unique BST...

qq_16927853的博客 231

Leetcode 95. Unique Binary Search Trees II BST二叉搜索树

Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n. Example: Input: 3 Output: [   [1,null,3,2],   [3,2,null,1],   [3,1,null,null,2],   [2,1,3...

salmonwilliam的博客 477

95 Unique Binary Search Trees II

题目链接:https://leetcode.com/problems/unique-binary-search-trees-ii/题目:Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.For example, Given n = 3, your program

再见了,过去的名字,新的奋斗开始啦! 5655

LeetCode 95: Unique Binary Search Trees II

问题描述 思路 https://leetcode.wang/leetCode-95-Unique-Binary-Search-TreesII.html#%E8%A7%A3%E6%B3%95%E5%9B%9B-%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92-2 递归 二叉树搜索树的性质:左子树的所有值小于根节点,右子树的所有值大于根节点。 所以如果求 1…n 的所有可能,...

zero 194
上一篇: leetcode 134. gas station
下一篇: leetcode 97. Interleaving String
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值