LintCode 不同的二叉查詢樹

2021-07-08 17:32:45 字數 1374 閱讀 1166

給出 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中。此處的解決辦法 遞迴的正常解法,從上往下遞迴,從下...