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. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  2. Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程

    SpringMVC 拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,可以自定义拦截器来实现特定的功能,自定义的拦截器可以实现HandlerInterceptor接口中的三个方法,也可以 ...

  3. 在Navicat新建Oracle表及用户

    1. 打开Navicat,链接Oracle, 连接成功. 2. Ctrl+Q,进入查询,创建表空间. 输入create tablespace test datafile 'D:\Oracle\test ...

  4. Node.js 官方文档中文版

    这目录也是醉了 . 列出跟没列出没两样

  5. 创建dynamics CRM client-side (五) - 使用regular expression (正则表达式)来检查phone number

    我们这次要使用account, 让我们首先重建一个JavaScript. 建议每个entity都创建专属的js // Converting functions to Namespace Notatio ...

  6. 优雅写Java之二(数组集合流)

    一.数组 二.集合 三.流 学习整理中,本文待补充--

  7. [校内训练20_01_22]ABC

    1.给出序列A,求序列B,使得bi|ai,lcm(b1,b2,...,bn)=lcm(a1,a2,...,an)且字典序最小. 可以发现,对于某个质数p,它有一个最大的次数k,将pk放在尽可能靠后且能 ...

  8. laravel 事件机制 实践总结

    laravel 事件机制 实践总结 观察者模式 在EventServiceProvider的linsten数组里面加上事件和监听器,键名是事件,键值里面的数组是一个或者多个监听器, protected ...

  9. STM8L15X 硬件I2C调试总结

    最近接到一个项目需要使用STM8L上硬件I2C与SN3731通信,用户方是个方案商,硬件设计人员也没留测试点,直接就把板子焊了拿来了.调试时除了swio口能用所有都不能用,硬件设计大概是为了显得自己焊 ...

  10. Spring注解开发系列Ⅸ --- 异步请求

    一. Servlet中的异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果要处理一些 ...