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.code
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
時間 O(N!) 空間 O(N)leetcode
二叉搜索樹有個性質,就是左邊的數都比根小,右邊的數都比根大。另外,題目說明二叉樹的節點是從1到n,因此咱們能肯定若是根爲k,則根左邊的數是1到k-1,根右邊的數是k+1到n。還有一點技巧是,對於經過一個根來講,惟一二叉樹的數量是其左子樹的數量乘以右子樹的數量,這是簡單的乘法原理。而且,左右子樹的形態數量是跟具體的數無關的,只跟這個樹裏有多少節點有關。而根能夠選擇從1到n的任意的數,惟一二叉樹的總數,就是根爲1到n的樹相加。因此該問題化簡爲以k爲根,其惟一左子樹和右子樹各有多少,這就是個動態規劃的問題了。咱們創建一個數組dp[i]
,表明節點數爲i的惟一子樹有多少個。顯然dp[0]=dp[1]=1
。get
public class Solution { 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]; } }