Unique Binary Search Trees--lintcode

Description

Given n, how many structurally unique BSTs (binary search trees) that store values 1…n?

Example

Given n = 3, there are a total of 5 unique BST’s.

這裏寫圖片描述

我的思路:
先列舉
n=1 num=1,n=2,num=2,n=3,num=2+2+1=5,n=4,num=5+2+2+5=14.
n=5,num=14+5+2+2+5+14=42,
n=6,num=132 !=42+14+5+2+2+5+14+42=126
找不到規律。此路不通
換一條思路。以 1-n之間各個數爲根節點,如:n=3時,1是根節點 num1=5,2爲根節點時,num2=2,3爲根節點時,num3=2,4爲根節點時,num4=5.
總數是5+2+2+5=14.可是各個數當根節點的num值是多少 沒有找出來。

別人的思路:
參考網址:https://segmentfault.com/a/1190000003811919
題目說明二叉樹的節點是從1到n,所以我們能確定如果根爲k,則根左邊的數是1到k-1,根右邊的數是k+1到n。還有一點技巧是,對於通過一個根來說,唯一二叉樹的數量是其左子樹的數量乘以右子樹的數量,這是簡單的乘法原理。並且,左右子樹的形態數量是跟具體的數無關的,只跟這個樹裏有多少節點有關。而根可以選擇從1到n的任意的數,唯一二叉樹的總數,就是根爲1到n的樹相加。

所以這個就變成動態規劃題了。

public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = dp[1] = 1;
        //從節點數2開始計算到節點數爲n的BST
        for(int i = 2; i < n + 1; i++){
            //計算根是第一個數的BST數量,直到根是最後一個數的BST數量,這裏j可以理解爲根左邊的節點數
            for(int j = 0; j < i; j++){
                //有n的節點的BST一共有 G(n)=F(1,n-1)+F(2,n-1)+...+F(n-1,n-1)個
                //以i爲根總共n個節點的BST有 F(i,n)=G(i-1)*G(i+1->n)個
                //BST形態數量之和一共有多少個節點有關 G(i+1->n)=G(n-i)
                //所以G(n)= G(0)*G(n-1)+G(1)*G(n-2)+...
                dp[i] += dp[j] * dp[i - j - 1];
            }
        }
        return dp[n];
    }

搜索了一下,有一種叫做卡塔蘭數。它的一般項公式爲
這裏寫圖片描述
裏面的數值 跟我列舉的一樣,可以套用這個公式 進行計算。

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