傳送門
題目:給定乙個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種?
示例: 輸入: 3 輸出: 5
解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
方法1. 動態規劃
給定乙個序列1…n,為了構造所有二叉樹,我們可以使用1…n中的每乙個數i作為根節點,自然1…(i-1)必然位於樹的左子樹中,(i+1)…n位於樹的右子樹中。然後可以遞迴來構建左右子樹,由於根節點i每次遞迴都是不同的,所以可以保證每次構建的二叉樹都是唯一的。
使用兩個狀態來記錄:
g(n):長度為n的序列的所有的bst。
f(i),1<=i<=n:以i作為根節點的bst的數量。
g(n)就是我們要求解的答案,g(n)可以由f(i)計算而來。
g(n)=f(1)+f(2)+…+f(n) ; g(0)=1, g(1)=1
對於給定的乙個序列1…n,我們取i作為它的根節點,
那麼以i作為根節點的二叉樹的數量f(i)可以由下面的公式計算而來:
f(i)=g(i-1)*g(n-i) 1<=i<=n
這個公式帶入上面:
g(n) = g(0) * g(n-1) + g(1) * g(n-2) + … + g(n-1) * g(0), g(n)就是答案
g(n)是對稱的, 不用擔心算f(i) 時 g(i-1)或者g(n-i)沒有提前被計算出來
public
intnumtrees
(int n)
}return dp[n]
;}
每一次的 dp[j-1]*dp[len-j] 計算出來一次 f(j)
裡層的for迴圈 和 dp[len]累加 組合起來 相當於: g(n)=f(1)+f(2)+…+f(n)
方法2 卡特蘭數
leetcode 96 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3n 0 表示,有0個點,那麼,可以組成的二叉查詢樹就乙個,那就是空樹 n 1表示,有1個點,那麼...
Leetcode 96 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3主要參考 本題其實是構造卡特蘭數的應用,採用動態規劃思想求解。通過求解出子問題來實現最終問題的求...
leetcode96 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 我們把n 0 時賦為1,因為空樹也算一種二叉搜尋樹,假設n個節點存在二叉排序樹的個數是g n ...