1. 程式人生 > >LeetCode96.不同的二叉搜尋樹

LeetCode96.不同的二叉搜尋樹

題目來源:https://leetcode-cn.com/problems/unique-binary-search-trees/description/

題目描述:

就跟斐波那契數列一樣,我們把n = 0 時賦為1,因為空樹也算一種二叉搜尋樹,那麼n = 1時的情況可以看做是其左子樹個數乘以右子樹的個數,左右字數都是空樹,所以1乘1還是1。那麼n = 2時,由於1和2都可以為跟,分別算出來,再把它們加起來即可。n = 2的情況可由下面式子算出:

num[2] =  num[0] * num[1](1為根的情況)  + num[1] * dp[0](2為根的情況)

同理可寫出 n = 3 的計算方法:

num[3] =  num[0] * num[2]  (1為根的情況) + num[1] * num[1]  (2為根的情況)  + num[2] * num[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.

根據以上分析,該題程式碼如下:

int numTrees(int n) {
    int num[n+1];
    num[0]=1;
    num[1]=1;
    for(int i=2;i<=n;i++){
        num[i]=0;
        for(int j=1;j<=i;j++){
            num[i]=num[i]+num[i-j]*num[j-1];
        }
    }  
    return num[n];
}