Leetcode:96. 不同的二叉搜索树

Leetcode:96. 不同的二叉搜索树

题目在链接中,点进去看看吧!

先介绍一个名词:卡特兰数

卡特兰数

卡特兰数Cn满足以下递推关系:

\[C_{n+1}=C_0C_n+C_1C_{n-1}+...+C_nC_0
\]

有兴趣的同学点击这里查看亚特兰数的百度百科

很巧的是,这道题可以利用亚特兰数计算出有多少个不同的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树,中序遍历得出的排列等于其升序排列

  1. 首先,当结点数为0时,树的个数为1

  2. 分析当结点数为1时:

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为0
    2. 因此结点数为1的左右子树情况为\(1*1=1\)
  3. 分析当结点数为2时:

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为1
    2. 因此1根节点所有可能出现的树情况为\(1*1=1\)
    3. 取2为根节点,则左子树的结点数为1,右子树的结点数为0
    4. 因此2根节点所有可能出现的树情况为\(1*1=1\)
    5. 因此结点数为2的左右子树情况为\(1+1=2\)
  4. 分析当结点数为3时:

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为2
    2. 因此1根节点所有可能出现的树情况为\(1*2=2\)
    3. 取2为根节点,则左子树的结点数为1,右子树的结点数为1
    4. 因此2根节点所有可能出现的树情况为\(1*1=1\)
    5. 取2为根节点,则左子树的结点数为2,右子树的结点数为0
    6. 因此3根节点所有可能出现的树情况为\(2*1=2\)
    7. 因此结点数为3的左右子树情况为\(1+2+1=5\)
  5. 有兴趣可以继续递推,总之总结规律:

    \[dp[k]=\sum_0^{k-1} dp[i]*dp[k-i-1]
    \]

  6. 然后就是编程实现啦~

Leetcode:96. 不同的二叉搜索树的更多相关文章

  1. Java实现 LeetCode 96 不同的二叉搜索树

    96. 不同的二叉搜索树 给定一个整数 n,求以 1 - n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 ...

  2. Leetcode 96. 不同的二叉搜索树

    题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...

  3. [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)

    题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ ...

  4. LeetCode 96——不同的二叉搜索树

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...

  5. LeetCode 96. 不同的二叉搜索树(Unique Binary Search Trees )

    题目描述 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 输出: 解释: 给定 n = , 一共有 种不同结构的二叉搜索树: \ / / / \ \ / / ...

  6. LeetCode 96 - 不同的二叉搜索树 - [DP]

    假定 $f[n]$ 表示有 $n$ 个节点的二叉树,有多少种不同结构. 因此 $f[n] = \sum_{i=0}^{n-1} (f[i] \times f[n-1-i])$,选一个节点作为根节点,那 ...

  7. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  8. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  9. Leetcode题目96.不同的二叉搜索树(动态规划-中等)

    题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 ...

随机推荐

  1. 美食家App开发日记5

    今天将ListView控件用更强大的Recyclerview控件取代,最后调试了程序. 感觉Android编程难度实在是远远高于javaweb,初次接触,感觉有很多东西想实现,想得很容易,但是实现起来 ...

  2. Python学习,第七课 - 文件操作

    Python中对文件的相关操作详解 文件的操作在今后的Python开发中也是使用非常频繁的. 先说下对文件操作的流程 打开文件,得到文件的一个句柄,赋值给一个变量 然后通过句柄对文件进行操作(内容的增 ...

  3. keras模型可视化

    #keras.utils.vis_utils模块提供了画出Keras模型的函数(keras版本2.0.2以上)pip install graphviz pip install pydotplus im ...

  4. 养成编程思维,可以从python开始,今天说说python注释

    先看思维导图!对内容简单了解一下. 提高代码的可读性,需要提供对代码的注释.python注释,主要作用在代码中,对代码功能进行解释,是一种标注性文字.一般情况下分成三类,单行注释.多行注释.中文声明注 ...

  5. swagger基本使用指南

    Maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-s ...

  6. Spring boot 学习中代码遇到的几个问题

    1.报一大段红错 此时对象还是能创建成功的,解决方案参考链接https://blog.csdn.net/wanglin199709/article/details/99121487 2.无法创建对象 ...

  7. react FileReader读取TXT文件并保存 split切割字符串 map()分别渲染切割后的数组内的所有字符串

    //class my_fileReader( e ) {         console.log(e.target.files[0]);         const reader = new File ...

  8. ubuntu18.04系统下无外部显示问题解决

    记录一下自己作死过程. 由于学习的需要,在windows10下装了ubuntu18.04系统,第一次装这个系统时,也出现了无外部显示,那时候是老师帮忙搞好的,当时没太在意,只是走马关花的看了老师操作了 ...

  9. Java的Integer与int互转

    int转Integer ; Integer wrapperi = new Integer(i); Integer转int ); int i = wrapperi.intValue(); JDK1.5以 ...

  10. top100tools

    Top 100 Tools for Learning 2013 2142 EmailShare Here are the Top 100 Tools for Learning 2013 –  the ...