動態規劃-力扣96-不同的二叉搜索樹

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

示例:

輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜索樹:

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

       對於這個題,我們可以首先找找規律,再決定遞推式:

       我們使用t[i]來表示一共有i個節點時,不同的樹的棵數。

       當 n=1時,毫無疑問只有一棵不同的樹,t[1]=1。

       當n=2時,又可以分爲兩種情況,以1爲根的時候,有一棵不同的樹,以2爲根的時候,有一棵不同的樹,故n=2時,有兩棵不同的樹,t[2] = 2。

       當n=3時,可以分爲3種情況,以1爲根的時候,其子節點都在根的右邊,此時其子樹等於n=2的情況,只是節點的值不同,以2爲根的時候,其子節點在其兩邊,一邊一個,此時所有不同的樹的棵樹等於左邊乘以右邊,即t[1] * t[1] = 1,以3爲根的時候,其子節點都在左邊,此時其子樹等於n=2的情況,故t[3] = 2*t[2] + t[1]*t[1] = 5。

      當n=4時,可以分爲4種情況,以1爲根的時候,其子節點都在根的右邊,此時其子樹等於n=3的情況,只是節點的值不同,以2爲根的時候,其子節點在其兩邊,左邊一個右邊兩個,此時所有不同的樹的棵樹等於左邊乘以右邊,即t[1] * t[2] = 2,以3爲根的時候,其子節點在其兩邊,左邊兩個右邊一個,此時所有不同的樹的棵樹等於左邊乘以右邊,即t[2] * t[1] = 2,以4爲根的時候,其子節點都在左邊,此時其子樹等於n=3的情況,故t[4] = 2*t[3] + t[1]*t[2] +t[2]*t[1] = 14。

      ……

      直到這裏,我們就可以發現遞推的規律了,即:

      t[n] = SUM(2 * t[i-1] +SUM( t[j-1]*t[i-j] )) i從3到n,n>=3,j從2到i-1。

     代碼如下:

 

class Solution {
    public int numTrees(int n) {
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        int g[] = new int[n+1];
        g[1] = 1;
        g[2] = 2;
        for(int i = 3;i<=n;i++){
            g[i] = g[i] +2*g[i-1];
            for(int j = 2;j<i;j++){
                g[i] +=g[j-1]*g[i-j];
            }
        }
        return g[n];
    }
}

 

 

 

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