Leetcode:96. 不同的二叉搜索树
Leetcode:96. 不同的二叉搜索树
Leetcode:96. 不同的二叉搜索树
题目在链接中,点进去看看吧!
先介绍一个名词:卡特兰数
卡特兰数
卡特兰数Cn满足以下递推关系:
\]
很巧的是,这道题可以利用亚特兰数计算出有多少个不同的BST。
Don't talk,show me code!
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+2);
dp[0]=1;
for(int i=1;i<=n;i++){
int temp=i-1;
while(temp>=0){
dp[i]+=dp[temp]*dp[i-temp-1];
temp--;
}
}
return dp[n];
}
};
简单分析
这道题利用的是动态规划的思想,递推得出一个dp数组。在找规律的过程中,我们意外发现这道题的答案与亚特兰数的数学递推式和dp方程完全一致!
前提条件:这是一颗BST树,中序遍历得出的排列等于其升序排列
首先,当结点数为0时,树的个数为1
分析当结点数为1时:
- 取1为根节点,则左子树的结点数为0,右子树的结点数为0
- 因此结点数为1的左右子树情况为\(1*1=1\)
分析当结点数为2时:
- 取1为根节点,则左子树的结点数为0,右子树的结点数为1
- 因此1根节点所有可能出现的树情况为\(1*1=1\)
- 取2为根节点,则左子树的结点数为1,右子树的结点数为0
- 因此2根节点所有可能出现的树情况为\(1*1=1\)
- 因此结点数为2的左右子树情况为\(1+1=2\)
分析当结点数为3时:
- 取1为根节点,则左子树的结点数为0,右子树的结点数为2
- 因此1根节点所有可能出现的树情况为\(1*2=2\)
- 取2为根节点,则左子树的结点数为1,右子树的结点数为1
- 因此2根节点所有可能出现的树情况为\(1*1=1\)
- 取2为根节点,则左子树的结点数为2,右子树的结点数为0
- 因此3根节点所有可能出现的树情况为\(2*1=2\)
- 因此结点数为3的左右子树情况为\(1+2+1=5\)
有兴趣可以继续递推,总之总结规律:
\[dp[k]=\sum_0^{k-1} dp[i]*dp[k-i-1]
\]然后就是编程实现啦~
Leetcode:96. 不同的二叉搜索树的更多相关文章
- Java实现 LeetCode 96 不同的二叉搜索树
96. 不同的二叉搜索树 给定一个整数 n,求以 1 - n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 ...
- Leetcode 96. 不同的二叉搜索树
题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...
- [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)
题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ ...
- LeetCode 96——不同的二叉搜索树
1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...
- LeetCode 96. 不同的二叉搜索树(Unique Binary Search Trees )
题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 输出: 解释: 给定 n = , 一共有 种不同结构的二叉搜索树: \ / / / \ \ / / ...
- LeetCode 96 - 不同的二叉搜索树 - [DP]
假定 $f[n]$ 表示有 $n$ 个节点的二叉树,有多少种不同结构. 因此 $f[n] = \sum_{i=0}^{n-1} (f[i] \times f[n-1-i])$,选一个节点作为根节点,那 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- Leetcode题目96.不同的二叉搜索树(动态规划-中等)
题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 ...
随机推荐
- C语言进阶——全局变量
全局变量 ·定义在函数外面的变量是全局变量 ·全局变量具有全局的生存期和作用域 ·它们与任何函数都无关 ·在任何函数内部都可以使用它们 全局变量初始化 ·没有做初始化的全局变量会得到0值 ·指针会得到 ...
- 美食家App开发日记5
今天将ListView控件用更强大的Recyclerview控件取代,最后调试了程序. 感觉Android编程难度实在是远远高于javaweb,初次接触,感觉有很多东西想实现,想得很容易,但是实现起来 ...
- 如何修改win7文件夹的显示方式为详细信息
1.首先对着空白处,鼠标右键单击,然后点击“排列方式” 选一个 还有 你还可以点击“查看” 选择图标大小.详细信息.平铺.列表 等2.点击我的电脑左上角的 组织 按钮 随后选择“文件夹和搜索选项” 再 ...
- linux 的21个命令:
1:ls [list] 2:输入输出重定向 3:| 管道 4:chmod 5:cd 6:mkdir 7:cp 8:rm 9:mv 10:cat 11:pwd 12:ln[link] 13:grep ...
- 插入数据值 设置标签属性的值 来自 精通ASP-NET-MVC-5-弗瑞曼
- Halo-个人独立博客系统
项目地址:https://github.com/halo-dev/halo 安装指导:https://halo.run/guide/ 简介: Halo 是一款现代化的个人独立博客系统,给习惯写博客 ...
- [CF 487C Prefix Product Sequence]
题意 将1~n的正整数重排列,使得它的前缀积在模n下形成0~n-1的排列,构造解或说明无解.n≤1E5. 思考 小范围内搜索解,发现n=1,n=4和n为质数时有解. 不难发现,n一定会放在最后,否则会 ...
- 【Java并发基础】局部变量是线程安全的
前言 方法中的变量(即局部变量)是不存在数据竞争(Data Race)的,也是线程安全的.为了理解为什么,我们先来了一下方法是如何被执行的,然后再分析局部变量的安全性,最后再介绍利用局部变量不会共享的 ...
- jsp路径
访问静态资源的时候${pageContext.request.Context}没有作用,在浏览器F12调试的时候发现,路径并没有被解释为项目的根路径,而是没有解释出来,还是${pageContext. ...
- springboot之整合基本的jdbc并操作Mysql数据库
对于数据访问层,无论是SQL还是NOSQL,springboot默认采用整合spring data方式进行统一处理,添加大量自动配置,屏蔽了许多设置,引入各种xxxTemplate,xxxReposi ...