【动态规划】96. 不同的二叉搜索树

题目:

 

 解答:

方法一:动态规划

 

设求以1...n为节点的二叉搜索树种数的问题为函数 G(n)

这个问题可以分解为以i为根的二叉搜索树的种数的和。设以i为根的二叉搜索树的种数用函数F(i,n)表示。

则有:G(n) = ∑ F(i,n)

F(i,n)可以由左子树和右子树的二叉搜索树种数的笛卡尔积表示

F(i,n) = G(i-1) * G(n-i)

所以:G(n) = ∑ G(i-1) * G(n-i)

 

class Solution {
    public int numTrees(int n) {
        int[] G = new int[n+1];
        G[0] = 1;
        G[1] = 1;

        for(int i=2;i<=n;i++)
            for(int j = 1;j<=i;j++){
                G[i] +=G[j-1]*G[i-j];
            }

        return G[n];
    }
}

 

方法二:数学方法

 

 

class Solution {
    public int numTrees(int n) {
        // 提示:我们在这里需要用 long 类型防止计算过程中的溢出
        long C = 1;
        for (int i = 0; i < n; ++i) {
            C = C * 2 * (2 * i + 1) / (i + 2);
        }
        return (int) C;
    }
}

 

posted @ 2020-09-21 20:21  3KBLACK  阅读(92)  评论(0)    收藏  举报