給出 n,問由 1…n 為節點組成的不同的二叉查詢樹有多少種?
給出n = 3,有5種不同形態的二叉查詢樹:
1 3 3 2 1
\ / / / \
\ 3 2 1 1 3 2
/ / \
\2 1 2 3
solution:
對於該問題我們可以使用動態規劃來求解。。對於動態規劃問題我們需要確定問題的狀態和狀態轉換方程。
首先我們來確定問題的狀態:給定i(
1≤i≤
n), 由1.
..i 組成的不同的二叉查詢樹有f(
i)種。
因此, 當 i
=1時 , 只有乙個節點,f(
1)=1
. 當 i
=2時,存在兩個節點1, 2。當以2作為根節點是只有1中,以1作為根節點時也只有1種,因此總共有2種。 當i
=3時,存在三個節點1,2,3。我們來進行詳細的敘述。
以3根節點時。其它的節點1,2只能在左子樹。及
3
/, 此時就轉換成了有多少種二叉樹。因此,3為根節點時有2中不同的二叉樹
以2為根節點時,節點3只能在右子樹,節點1只能在左子樹。及
2
/ \, 由於左子樹只有乙個節點因此只有1種,同樣右子樹也只有1中。因此2為根節點有1x1=1種。
以1為根節點時,節點只能在右子樹。及
1
\, 此時就變成有多少種二叉樹=f(2)。因此1為根節點有2種。
因此有f(3) = 2 + 1 + 2 = 5種。
分析到這裡狀態轉換方程應該很容易寫出來了吧?! 對於i
, 以k(
1≤k≤
i)作為根節點, 左子樹的節點為1,
...,
k−1 共有k−
1 個節點,右子樹的節點為k+
1,..
.,i 共有i−
k 個節點。因此,狀態裝換方程為 f(
i)=∑
ik=1
f(k−
1)×f
(i−k
) 注意:邊界條件f(0)=1
上述等式還可以繼續進行優化,這裡不再詳細敘述。詳見**.
public
class
solution
}return res[n];
}}
lintcode 163 不同的二叉查詢樹
給出 n,問由 1.n 為節點組成的不同的二叉查詢樹有多少種?樣例給出n 3,有5種不同形態的二叉查詢樹 標籤卡特蘭數 動態規劃 思路 參考部落格 的遞推思路,使用卡特蘭數,另外使用動態規劃,使用一維陣列 dp i 儲存由 i 個節點組成的不同的二叉查詢樹的種類 卡特蘭數的遞推公式為 f n f n...
LintCode刷題 不同的二叉查詢樹I II
不同的二叉查詢樹i 題目內容 給出 n,問由 1.n 為節點組成的不同的二叉查詢樹有多少種?樣例 給出n 3,有5種不同形態的二叉查詢樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3演算法分析 先來看一下二叉查詢樹的特點,當選定乙個節點i作為中間節點時 位於該節點左子樹中的所有節點均小...
lintcode 不同的二叉樹II
解法思路 要生成所有情況的二叉樹,首先肯定能想到遍歷所有的數作為頭結點的情況,構建頭結點的左右子樹的過程可以利用遞迴完成。此處難點應該在於 1 同乙個數作為頭結點時,子樹可以有不同的結構 2 當前樹已經構造完成,應該將頭結點加入到結果vector中。此處的解決辦法 遞迴的正常解法,從上往下遞迴,從下...