96. 不同的二叉搜索树

——————————————————————————————————————————
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
——————————————————————————————————————————
这里首先说一下什么是二叉搜索树,二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
——————————————————————————————————————————
1、动态规划

给定一个有序序列 1 … n,为了根据序列构建一棵二叉搜索树。我们可以遍历每个数字 i,将该数字作为树根,1 … (i-1) 序列将成为左子树,(i+1) … n 序列将成为右子树。于是,我们可以递归地从子序列构建子树。 在上述方法中,由于根各自不同,每棵二叉树都保证是独特的。

可见,问题可以分解成规模较小的子问题。因此,我们可以存储并复用子问题的解,而不是递归的(也重复的)解决这些子问题,这就是动态规划法。

题目问题是计算不同二叉搜索树的个数。为此,我们可以定义两个函数:
G(n): 长度为n的序列的不同二叉搜索树个数。
F(i, n): 以i为根的不同二叉搜索树个数(1≤i≤n)。

可见,G(n)G(n) 是我们解决问题需要的函数。稍后我们将看到,G(n)G(n) 可以从 F(i, n)F(i,n) 得到,而 F(i, n)F(i,n) 又会递归的依赖于 G(n)G(n)。

首先,根据上一节中的思路,不同的二叉搜索树的总数 G(n)G(n),是对遍历所有 i (1 <= i <= n) 的 F(i, n)F(i,n) 之和。换而言之:

特别的,对于边界情况,当序列长度为 1 (只有根)或为 0 (空树)时,只有一种情况。亦即:

给定序列 1 … n,我们选出数字 i 作为根,则对于根 i 的不同二叉搜索树数量 F(i, n)F(i,n),是左右子树个数的笛卡尔积,如下图所示:

举例而言,F(3, 7)F(3,7),以 3 为根的不同二叉搜索树个数。为了以 3 为根从序列 [1, 2, 3, 4, 5, 6, 7] 构建二叉搜索树,我们需要从左子序列 [1, 2] 构建左子树,从右子序列 [4, 5, 6, 7] 构建右子树,然后将它们组合(即笛卡尔积)。 巧妙之处在于,我们可以将 [1,2] 构建不同左子树的数量表示为 G(2)G(2), 从 [4, 5, 6, 7]` 构建不同右子树的数量表示为 G(4)G(4)。这是由于 G(n)G(n) 和序列的内容无关,只和序列的长度有关。于是,F(3,7) = G(2) \cdot G(4)F(3,7)=G(2)⋅G(4)。 概括而言,我们可以得到以下公式:

将公式 (1),(2) 结合,可以得到 G(n)G(n) 的递归表达公式:

为了计算函数结果,我们从小到大计算,因为 G(n)G(n) 的值依赖于 G(0) … G(n-1)G(0)…G(n−1)。

根据以上的分析和公式,很容易实现计算 G(n)G(n) 的算法。

作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode/
来源:力扣(LeetCode)
——————————————————————————————————————————
以上算法原理的C++代码如下:

class Solution {
public:int numTrees(int n) {vector<int> num(n+1,0);num[0]=1;num[1]=1;for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){num[i]=num[j-1]*num[i-j] + num[i];}}return num[n];}
};

leetcode - 96. 不同的二叉搜索树相关推荐

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

    Leetcode 96. 不同的二叉搜索树 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/unique-binary- ...

  2. LeetCode 96不同的二叉搜索树95不同的二叉搜索树Ⅱ

    微信搜一搜:bigsai 算法文章题解全部收录在github仓库bigsai-algorithm 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复 ...

  3. LeetCode 96. 不同的二叉搜索树(DP)

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

  4. [leetcode] 96. 不同的二叉搜索树 +[补充] 不同的二叉树,不同形态的二叉树的个数----catalan数

    leetcode官方的题解:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha ...

  5. Leetcode 96. 不同的二叉搜索树 解题思路及C++实现

    解题思路: 因为二叉搜索树的左右子树均为二叉搜索树.输入整数n,求其所有二叉搜索树的总数,就是求根节点分别为1,2, ..., n的二叉搜索树的总和. 假设 i 的二叉搜索树的总数为 f(i),当根节 ...

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

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

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

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

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

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

  9. LeetCode 96.不同的二叉搜索树(卡特兰数)

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

最新文章

  1. RedisTemplate操作hash数据类型示例
  2. oracle 补丁打不上_oracle 打补丁常见问题
  3. Python 这么热,运维要不要追赶 Python 的热潮?
  4. 什么情况下使用多线程
  5. docker单机安装rocketmq双主双从
  6. vue+vuex初入门
  7. 雷赛控制卡总线方式的坑
  8. 华为m6平板电脑Linux,华为平板M6 10.8英寸版使用体验及全面评测
  9. 这个“忽悠”马云10亿的男人,还了阿里5000亿,今天当选为院士!
  10. 查学籍网站报服务器错误,学籍系统常见问题
  11. EditPlus下载安装和汉化
  12. 微型计算机内存与外存的区别,计算机的内存 和外存一样吗?
  13. 【考题·数学】矩阵游戏(数学推导)
  14. python自动更换电脑桌面壁纸
  15. python多线程并发编程技术_三 python并发编程之多线程-理论
  16. linux移植街机模拟器,gngeo 游戏模拟器(街机)移植CE3100
  17. 机器学习的「反噬」:当 ML 用于密码破解,成功率竟然这么高!
  18. 四、jOOQ 系列教程 - Record 详解
  19. 基于MFC的透视投影算法实现
  20. 云悦智企业物联网官网源码

热门文章

  1. Linux下查看物理CPU、逻辑CPU和CPU核数
  2. V8 之旅: 垃圾回收器
  3. 阿里云 Composer 全量镜像
  4. Git如何进行减少提交历史数量以及修改自己的commit中的邮箱
  5. Docker快速搭建Bugzilla
  6. Android8.1 MTK平台 截屏功能分析
  7. Ansible playbook
  8. Springmvc 返回html视图解决
  9. “Table .__efmigrationshistory doesn’t exist”的解决方案
  10. C#LeetCode刷题之#119-杨辉三角 II(Pascal‘s Triangle II)