96 不同的二叉搜尋樹(動態規劃 數學)

2021-10-24 21:11:30 字數 2087 閱讀 4873

1. 問題描述:

給定乙個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?

輸入: 3

輸出: 5

解釋:

給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:

1          3     3      2      1

\         /      /       /  \      \

3      2     1       1  3      2

/      /        \                     \

2     1         2                   3

2. 思路分析:

① 一開始的時候想到使用遞迴的思路解決,可以使用遞迴建立出二叉搜尋樹:以當前的i作為根節點進行遞迴建立,比當前的根節點小那麼遞迴左子樹,比當前的根節點大那麼遞迴右子樹,但是後面發現對於某些情況會重複進行遞迴,比如n = 3的時候,以2為根節點那麼只有一種二叉搜尋樹,但是因為比當前的根節點小就遞迴左子樹,比根節點大就遞迴右子樹最後,沒有任何的限制條件所以會導致重複遞迴(第一次的時候是先遞迴2的左子樹1,然後遞迴右子樹3,第二次是遞迴2的右子樹3然後遞迴左子樹1但是這兩種二叉樹都是一樣的)

1      3

所以這樣寫是不正確的

② 在官方的題解中使用的是遞推的方式,其中的策略與我之前的想法是一樣的,核心也是以i作為當前的根節點來進行遞推,並且以當前的i作為根節點也表示當前的二叉樹是有i個節點的,比如n = 3,我們可以嘗試以1為根節點,2為根節點,3為根節點下所形成的的二叉搜尋樹的個數然後累加起來,以i為根節點這樣就將n分為了i - 1個節點與 n - 1個節點的兩棵子樹,i - 1個節點的二叉搜尋樹與n - 1個節點的二叉搜尋樹是由之前的節點數為0與1的時候一步步往下推導出來的,而以i為根節點形成的二叉搜尋樹的數目是由其節點數目為i - 1與 n - 1的左右子樹組合形成的,所以左右子樹組合的數目為兩個數目相乘的結果,所以由分析可以得到官網中的公式:

f(i, n)表示的是以節點數目為i為根節點所形成的二叉樹的數目,g(i - 1)與g(n - i)表示的是以節點數目i - 1與n - 1的左右子樹的組合數目(左子樹有i種,右子樹有j種,所以最終形成的數目肯定是i * j)

所以由n個節點的二叉樹我們是可以以1,2,3...n為根節點進行累加求得最終的結果的,也就是可以得到官網中的公式:

所以使用兩層迴圈就可以解決了,第一層迴圈表示以當前節點的個數,第二層迴圈表示在當前節點數目i的情況下以1,2,3... i為根節點的所形成的二叉搜尋樹的數目,最後將其累加求和得到的就是以當前的節點的數目的二叉搜尋樹的數目

③ 上面的第二個公式其實在數學上是卡塔蘭數表示的公式:

3. **如下:

官網**:

class solution:

def numtrees(self, n):

g = [0]*(n+1)

g[0], g[1] = 1, 1

for i in range(2, n+1):

for j in range(1, i+1):

g[i] += g[j-1] * g[i-j]

return g[n]

卡塔蘭數公式:

class solution:

def numtrees(self, n: int) -> int:

return int(math.factorial(2*n)/math.factorial(n+1)/math.factorial(n))

96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3思路 這個題目實際上是乙個數學題,設整數p組成的二叉樹共有c p 種情況。當給定乙個整數n的時候...

96 不同的二叉搜尋樹

二叉搜尋樹,又被稱為是二叉查詢樹 二叉排序樹,這種樹其左子樹所有節點的值均小於根節點的值,其右子樹所有節點的值均大於根節點的值,並且其左 右子樹均為二叉搜尋樹。空樹也是二叉搜尋樹。方法一 動態規劃法 這道題可以用動態規劃的思想去解決。由於給定的節點值為1 n,是一組從小到大順序排列的資料,其中,任意...

96 不同的二叉搜尋樹

dp i 代表有 i 個結點 1.i 時候的二叉搜尋樹種數。首先就是要考慮怎麼和之前的dp連線起來,也就是說選擇有幾種。首先可以就直接把 i 這個數放在 i 1 二叉樹的根節點,二叉搜尋樹的種數就是dp i 1 如果把 i 放在左子樹,i 1是根節點,那就有dp 1 dp i 2 左子樹 右子樹 在...