問題:ip
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?get
For example,
Given n = 3, there are a total of 5 unique BST's.io
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解決:class
① 二叉搜索樹有個性質,就是左邊的數都比根小,右邊的數都比根大。另外,題目說明二叉樹的節點是從1到n,因此咱們能肯定若是根爲k,則根左邊的數是1到k-1,根右邊的數是k+1到n。時間 O(N!) 空間 O(N)二叉樹
這道題其實是 Catalan Number卡塔蘭數的一個例子,當 n = 1時,只能造成惟一的一棵二叉搜索樹,n分別爲1,2,3的狀況以下所示:搜索
n = 0 時賦爲1,由於空樹也算一種二叉搜索樹;方法
n = 1時的狀況能夠看作是其左子樹個數乘以右子樹的個數,左右字數都是空樹,因此1乘1仍是1。im
n = 2時,因爲1和2均可覺得根,分別算出來,再把它們加起來便可。n = 2的狀況可由下面式子算出: img
dp[2] = dp[0] * dp[1] (1爲根的狀況)di
+ dp[1] * dp[0] (2爲根的狀況)
同理可寫出 n = 3 的計算方法:
dp[3] = dp[0] * dp[2] (1爲根的狀況)
+ dp[1] * dp[1] (2爲根的狀況)
+ dp[2] * dp[0] (3爲根的狀況)
由此能夠得出卡塔蘭數列的遞推式爲:
因此,能夠獲得以下代碼:
class Solution { //0ms public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2;i <= n;i ++ ) {//計算節點數2到n的BST for (int j = 0;j < i ;j ++ ) { dp[i] += dp[j] * dp[i - j - 1]; } } return dp[n]; } }