96. 不同的二叉搜索树

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96. 不同的二叉搜索树相关的知识,希望对你有一定的参考价值。

96. 不同的二叉搜索树

 


题目

传送门:https://leetcode.cn/problems/unique-binary-search-trees/


 


算法设计:枚举

当 n = 5,用 1、2、3、4、5 BST数是多少组?

有 5 种情况,因为每个数字都可以作为根节点。

  • 以 1 为根节点的BST数
  • ······
  • 以 5 为根节点的BST数

比如固定 3 作为根节点,这个前提下能有几种不同的 BST 呢?

根据 BST 的特性,根节点的左子树都比根节点的值小,右子树的值都比根节点的值大。

固定 3 作为根节点,左子树节点就是 1,2、2,1 的组合,右子树就是 4,5、5、4 的组合,2*2=4。

左子树的组合数和右子树的排列数乘积,就是 3 作为根节点时的 BST 个数。

class Solution 
public:
    int numTrees(int n) 
        if(n <= 1) return 1;
        int ans = 0;
        for(int i = 1; i <= n; i++) 
            ans += numTrees(i-1) * numTrees(n-i);
        return ans;
    
;

缓存,减少子问题的计算:

class Solution 
public:
    int dp[20];
    int numTrees(int n) 
        if(n <= 1) return 1;
        if(dp[n]) return dp[n];
        for(int i = 1; i <= n; i++) 
            dp[n] += numTrees(i-1) * numTrees(n-i);
        return dp[n];
    
;

 


算法设计:动态规划

如果整数 1 ~ n 中的 k 作为根节点值,如 n = 3 时,k = 1、2、3:

  • 1 为根节点时BST数量
  • 2 为根节点时BST数量
  • 3 为根节点时BST数量
  • 定义状态 dp[i],为 i 为根节点时BST数量

那 dp[i] 从哪里来?

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

以上是关于96. 不同的二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

96. 不同的二叉搜索树

Leetcode 96. 不同的二叉搜索树

Leetcode 96.不同的二叉搜索树

LeetCode 96.不同的二叉搜索树

leetcode 96. 不同的二叉搜索树

LeetCode(96): 不同的二叉搜索树