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. Xmind: ZEN快捷键

  2. SpringMVC简单使用教程

    一.SpringMVC简单入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...

  3. HashMap在JDK7和JDK8中的区别

    在[深入浅出集合Map]中,已讲述了HashMap在jdk7中实现,在此就不再细说了 JDK7中的HashMap 基于链表+数组实现,底层维护一个Entry数组 Entry<K,V>[]  ...

  4. [转载收藏]C#基础知识梳理系列十一:垃圾回收机制

    摘 要 基于.NET平台的开发语言中,最让开发人员爽的一点就是垃圾回收处理机制,在编码过程中,终于可以解放你的双手来关注更重要的事情.很多的资料中在讲到.NET中的垃圾回收机制时都说"CLR ...

  5. jade 的 考古

    Jade是一款高性能简洁易懂的模板引擎(加上这两个字我想起了发动机,为什么不直接叫发动机呢), Jade是Haml的Javascript实现, 在服务端(NodeJS)及客户端均有支持. haml 是 ...

  6. 使用Razor 使用Razor表达式处理命名空间 精通ASP-NET-MVC-5-弗瑞曼

  7. makefile自动依赖生成

    自动依赖生成 基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列 举依赖. 这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法. 文章 ...

  8. Canny边缘检测算法(基于OpenCV的Java实现)

    目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...

  9. redis--->微博小项目

    redis 微博小项目 centos6.9+lnmp+redis 写的微博小项目,梳理了redis在项目中kes的设计,redis各种数据结构在不同业务场景下的应用等知识点. 这里用的php框架是自己 ...

  10. Android和servlet通过json完成登录

    1.主要过程:Android端发送json数据,servlet接收后解析json数据,通过连接数据库比较并返回json数据到Android端.整个效果: 2.Android端网络连接使用OKHttp开 ...