1. 题目

2. 解答

以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树。当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将构建为右子树。因此,这是一个递归问题。

若以第 \(i\) 个数据为根节点,其左边数据有 \(i-1\) 个,左子树可能情况为 left_num,右边数据有 \(n-i\) 个,右子树可能情况为 right_num,因此以当前数据为根节点可以构建出 left_num * right_num 个二叉搜索树。

所以,我们要做的就是遍历 \(i = 1\cdots n\),统计出每个数据作为根节点可以构建出的二叉搜索树总个数即可。

  • 递归法
class Solution {
public:int numTrees(int n) {int sum = 0;if (n <= 1) return 1;// 以当前的数为根节点,左右两边的数分别构建子树for (int i = 1; i <= n; i++){int left_num = numTrees(i - 1); // 左边的数可以构建多少个二叉搜索树int right_num = numTrees(n - i); // 右边的数可以构建多少个二叉搜索树sum += left_num * right_num;}return sum;}
};

但是上面的程序运行时超时了,其实我们只需要统计一半数据就可以了,因为两边是对称的。

比如我们有 1,2,3,4,5 五个数,以 2 作为根节点,左边有 1 个数,右边有 3 个数。以 4 作为根节点,左边有 3 个数,右边有 1 个数。这两种情况是一样的,因此如果数据个数为偶数,我们只需要统计一半数据即可,而为奇数的话我们就要再多统计一个中间数据。

class Solution {
public:int numTrees(int n) {int sum = 0;if (n <= 1) return 1;int is_odd = n % 2;int mid = n / 2;// 以当前的数为根节点,左右两边的数分别构建子树for (int i = 1; i <= mid; i++){int left_num = numTrees(i - 1); // 左边的数可以构建多少个二叉搜索树int right_num = numTrees(n - i); // 右边的数可以构建多少个二叉搜索树sum += left_num * right_num;}sum = sum * 2;if (is_odd) sum = sum + numTrees(mid) * numTrees(n - mid - 1);return sum;}
};

此外,我们还可以定义一个全局变量,来存放已经计算过的数值,避免在递归过程中大量地重复计算。

class Solution {
public:#define MAX 1000int nums[MAX]; // 存放已经计算过的数值int numTrees(int n) {int sum = 0;//if (n <= 0) return 1;if (n <= 1) return 1;// 以当前的数为根节点,左右两边的数分别构建子树for (int i = 1; i <= n; i++){if (nums[i-1] == 0) nums[i-1] = numTrees(i - 1); // 左边的数可以构建多少个二叉搜索树int left_num = nums[i-1];if (nums[n-i] == 0) nums[n-i] = numTrees(n - i); // 右边的数可以构建多少个二叉搜索树int right_num = nums[n-i]; sum += left_num * right_num;}return sum;}
};
  • 迭代法
    还可以将递归改写为循环,避免函数多次调用执行效率较低。
class Solution {
public:int numTrees(int n) {int nums[n+1] = {0};nums[0] = 1;nums[1] = 1;if (n <= 1) return 1;for (int i = 2; i <= n; i++){// 从 n=2 开始统计可以构建多少个不同的二叉搜索树for (int j = 1; j <= i; j++){nums[i] += nums[j-1] * nums[i-j];}}return nums[n];}
};      

获取更多精彩,请关注「seniusen」!

转载于:https://www.cnblogs.com/seniusen/p/9991185.html

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. 不同的二叉搜索树

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Linq to objects示例
  2. 【JavaSE_07】Java中类和对象-封装特性
  3. Ethercat解析(十一)之分布时钟
  4. 好家伙,这才是最强的目标检测落地模型!
  5. DSP 2812: 使用C++封装外设时钟控制
  6. 一行代码教你屏蔽你的博客广告
  7. named-checkzone命令--Linux命令应用大词典729个命令解读
  8. 视觉与智能学习近期期刊阅读与相关知识学习
  9. You are asking Spring Security to ignore Ant(xx) This is not recommended, please use permitAll... 处理
  10. Azure DevOps On-Premises如何让你的代理联机
  11. 给定激励,求零输入响应、零状态响应,全响应
  12. 确认过眼神,地址不是对的人—— 权限验证错误 | 漏洞分析连载之五
  13. HAUE河工计院OJ1100 - 1150题解
  14. 苹果7显示无法接通激活服务器,打电话时,显示对方手机暂时无法接通是什么原因?答案其实很简单...
  15. Linux 系统结构详解——新手上路
  16. 穿越火线活动网页显示Java_Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~...
  17. 02、射频中Г、S Parameters、RL、IL、Gain、VSWR、NF、P1dB、HMD、IMD、ACPR、IIP3、OIP3、DRSF、PAE等指标计算及其重点公式总结
  18. spring框架教程 Spring开发实例 spring mvc视频教程下载
  19. Eclipse 跌落“神坛”,VS Code 等新兴 IDE 后来居上!
  20. 什么是位、字节、字、KB、MB?

热门文章

  1. html5语义化编程,HTML5常用的语义化标签
  2. python封装c++接口_用C++封装MySQL的API的教程
  3. centos的服务管理
  4. java slider如何设置成可变的_Java自定义JSlider UI
  5. mysql5.6找不到int_为什么在mysql 5.6中,在int字段上自动递增跳过“2147483646”?
  6. 「 iOS知识小集 」2018 · 第 38 期
  7. #include,#import ,@class 有什么区别?
  8. Linux内存调试工具初探-MEMWATCH
  9. PHP5.3x被弃用的函数及代替方法
  10. 大网的经验(华为的创新—转载)