[leetcode] 96. Unique Binary Search Trees

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

For example,
Given n = 3, there are a total of 5 unique BST's.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

解題思路:
首先解釋一下題目的意思,題目要求是給定數(shù)字序列1....n,求出可能的二叉搜索樹的個數(shù)。

本題可以采用動態(tài)規(guī)劃的方法來解決。具體公式[F(i, n) = G(i-1) * G(n-i)]。
給定一個序列1.....n, 來構(gòu)造一個BST, 我們可以枚舉系列中的每個數(shù)字i, 然后使用i作為根節(jié)點,很自然的,子序列1....(i-1)可以構(gòu)成i的左子樹,而(i+1)....n可以構(gòu)成i的右子樹,而且左子樹和右子樹葉都是BST.通過上面的方法,我們可以確保所構(gòu)造的BST都是不同的,因為根節(jié)點是不同的。

為了求出不同的BST的個數(shù),我們定義以下兩個函數(shù):

*  G(N): 給定數(shù)字序列1....n, 求出可能的二叉樹的個數(shù)。
*  F(i, n) , i <= i <= n, 給定數(shù)字i, 并且數(shù)字i作為根節(jié)點,求出可能的二叉樹個數(shù)。

根據(jù)以上兩個定義的函數(shù),可以得出G(n)就是題目的解,而G(n)可以通過求解F(i,n)得到,具體公式為:

G(n) = F(1, n) + F(2, n) + ... + F(n, n). '
G(0) = 1, G(1) = 1.

給定一個序列1.....n, 選擇i作為BST的根節(jié)點,則二叉樹的個數(shù)為:F(i,n)。 為了求F(i,n), 我們將F(i,n)拆分為左子樹的個數(shù)和右子樹的個數(shù),因此可以得到以下公式:

F(i,n) = G(i-1) *(n-i)      1<= i <= n

具體代碼如下:

class Solution {
public:
    int numTrees(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        
        vector<int> ret(n+1,0);//增加第零個元素,所以size為n+1
        ret[0] = 1;
        ret[1] = 1;
        
        for(int i = 2; i <= n; ++i)
        {
            for(int j = 1; j <= i; ++j)
                ret[i] += ret[j-1] * ret[i-j]; 
        }
        return ret[n];
    }
};

參考資料:https://discuss.leetcode.com/topic/8398/dp-solution-in-6-lines-with-explanation-f-i-n-g-i-1-g-n-i

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容