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

Posted lina2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于096 Unique Binary Search Trees 不同的二叉查找树的主要内容,如果未能解决你的问题,请参考以下文章