96. 不同的二叉搜索树

96. 不同的二叉搜索树

96. 不同的二叉搜索树

// [96. 不同的二叉搜索树](https://leetcode-cn.com/problems/unique-binary-search-trees/)
// n个整数-> 每个整数都可以作为根节点 for(i: n)-> [1, i-1]左子树, [i+1,n]右子树 dp[1] = 1
// 递推公式直接就出来了 dp[i]表示 n=i时候可以构成的种数, dp[i] = dp[left] * dp[right], left(左子树节点数=i-1),right(右子树节点数n-i)
// 比如 dp[3] = 根节点为1 + 根节点为2 + 根节点为3, 其中根节点为2时, dp[3] = dp[1] * dp[1] = 1
// 这样代码就很容易写出来了
class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;//不管一个节点还是空子树都只有一种情况
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            for (int root = 1; root <= i; root++) {
                dp[i] += (dp[root - 1] * dp[i - root]);
            }
        }
        return dp[n];
    }
}
// 优化, 由于种类数是对称的, 可以这样计算 for (int root = 1; root <= i/2; root ++) dp[i] += (dp[root - 1] * dp[i - root])*2; 奇数个数还需要补充左右子树个数一样的种类数
class Solution2 {
    public int numTrees(int n) {
        return 0;
    }
}
// 数学推导就是这样的
// G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n)
// f(i)=G(i−1)∗G(n−i)
// G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+...+G(n−1)∗G(0) ;卡特兰数
posted @ 2022-03-06 17:28  -Rocky-  阅读(29)  评论(0编辑  收藏  举报