096 Unique Binary Search Trees 不同的二叉查找树

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
例如,
给出 n = 3,则有 5 种不同形态的二叉查找树:
   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3
详见:https://leetcode.com/problems/unique-binary-search-trees/description/

这道题实际上是 Catalan Number卡塔兰数的一个例子。当n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为根,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

dp[2] =  dp[0] * dp[1]   (1为根的情况)

    + dp[1] * dp[0]    (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] =  dp[0] * dp[2]   (1为根的情况)

    + dp[1] * dp[1]    (2为根的情况)

      + dp[2] * dp[0]    (3为根的情况)

由此可以得出卡塔兰数列的递推式为:

C_0 = 1 \quad \mbox{and} \quad C_{n+1}=\sum_{i=0}^{n}C_i\,C_{n-i}\quad\mbox{for }n\ge 0.

Java实现:

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 j=0;j<i;++j){
                dp[i]+=dp[j]*dp[i-j-1];
            }
        }
        return dp[n];
    }
}

参考:https://www.cnblogs.com/grandyang/p/4299608.html

posted on 2018-04-04 15:37  lina2014  阅读(85)  评论(0编辑  收藏  举报

导航