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 不同的二叉查找树的主要内容,如果未能解决你的问题,请参考以下文章

Unique Binary Search Trees,Unique Binary Search Trees2 生成二叉排序树

Unique Binary Search Trees

Unique Binary Search Trees

树Unique Binary Search Trees II

树Unique Binary Search Trees

96_Unique Binary Search Trees