leetcode算法練習——不同的二叉搜索樹

題目:

給定一個整數 n,求以 1 … n 爲節點組成的二叉搜索樹有多少種?

示例:
在這裏插入圖片描述

代碼如下:

長度爲n的序列的不同二叉搜索樹個數C(n)爲卡塔蘭數。

首先,設長度爲nn,數ii作爲根時,二叉搜索樹的個數爲F(i,n)F(i,n)
C(n)C(n)=i=1nF(i,n)\sum^n_{i=1}F(i,n)

當數ii作爲根時,11i1i-1i+1i+1nn分別構成ii的左子樹和右子樹。
11i1i-1構成的左子樹數量可以用C(i1)C(i-1)表示,i+1i+1nn構成的右子樹數量可以用C(ni)C(n-i)表示。

因爲長度爲n的序列構成的二叉搜索樹的數量只與序列長度有關,與序列裏數的大小無關。
F(i,n)F(i,n)=C(i1)C(ni)C(i-1)*C(n-i)

所以C(n)C(n)可以寫成C(n)C(n)=i=1nC(i1)C(ni)\sum^n_{i=1}C(i-1)*C(n-i)
這是卡塔蘭數的形式。

特殊情況:C(0)=1C(0)=1C(1)=1C(1)=1

class Solution {
public:
    int numTrees(int n) 
    {
        if (n==0) return 1;
        long C = 1;
        for(int i=1;i<=n;i++)
        {
            C = C*(4*i-2)/(i+1);
        }
        return C;
    }
};

運行結果:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章