96 不同的二叉搜尋樹

2021-10-02 17:51:29 字數 2755 閱讀 2526

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

示例:

輸入: 3

輸出: 5

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

1 3 3 2 1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

方法一:動態規劃本問題可以用動態規劃求解。

給定乙個有序序列 1 … n,為了根據序列構建一棵二叉搜尋樹。我們可以遍歷每個數字 i,將該數字作為樹根,1 … (i-1) 序列將成為左子樹,(i+1) … n 序列將成為右子樹。於是,我們可以遞迴地從子串行構建子樹。

在上述方法中,由於根各自不同,每棵二叉樹都保證是獨特的。

可見,問題可以分解成規模較小的子問題。因此,我們可以儲存並復用子問題的解,而不是遞迴的(也重複的)解決這些子問題,這就是動態規劃法。

演算法

問題是計算不同二叉搜尋樹的個數。為此,我們可以定義兩個函式:

可見,g(n) 是我們解決問題需要的函式。

稍後我們將看到,g(n

)g(n)

g(n)

可以從f(i

,n

)f(i,n)

f(i,n)

得到,而f(i

,n

)f(i,n)

f(i,n)

又會遞迴的依賴於g(n

)g(n)

g(n)

。首先,根據上一節中的思路,不同的二叉搜尋樹的總數g(n

)g(n)

g(n)

,是對遍歷所有i(1 <= i <= n) 的 f(i

,n

)f(i,n)

f(i,n)

之和。換而言之:

g (n

)=∑i

=1nf

(i,n

)g(n)= \sum_^n f(i,n)

g(n)=i

=1∑n

​f(i

,n)特別的,對於邊界情況,當序列長度為 1 (只有根)或為 0 (空樹)時,只有一種情況。亦即:

g (0

)=1,

g(1)

=1

g(0)=1,g(1)=1

g(0)=1

,g(1

)=1給定序列1 ... n,我們選出數字i作為根,則對於根i的不同二叉搜尋樹數量f(i

,n

)f(i, n)

f(i,n)

,是左右子樹個數的笛卡爾積,如下圖所示:

舉例而言,f(3

,7

)f(3, 7)

f(3,7)

,以 3 為根的不同二叉搜尋樹個數。為了以 3 為根從序列 [1, 2, 3, 4, 5, 6, 7] 構建二叉搜尋樹,我們需要從左子串行 [1, 2] 構建左子樹,從右子串行 [4, 5, 6, 7] 構建右子樹,然後將它們組合(即笛卡爾積)。

巧妙之處在於,我們可以將 [1,2] 構建不同左子樹的數量表示為g(2

)g(2)

g(2)

, 從 [4, 5, 6, 7]` 構建不同右子樹的數量表示為g(4

)g(4)

g(4)

。這是由於g(n

)g(n)

g(n)

和序列的內容無關,只和序列的長度有關。於是,f(3

,7)=

g(2)

⋅g(4

)f(3,7)=g(2)⋅g(4)

f(3,7)

=g(2

)⋅g(

4)。 概括而言,我們可以得到以下公式:

f (i

,n)=

g(i−

1)⋅g

(n−i

)f(i,n)=g(i−1)⋅g(n−i)

f(i,n)

=g(i

−1)⋅

g(n−

i)將公式 (1),(2) 結合,可以得到g(n

)g(n)

g(n)

的遞迴表達公式:

g (n

)=∑i

=1ng

(i−1

)⋅g(

n−i)

g(n)= \sum_^n g(i−1)⋅g(n−i)

g(n)=i

=1∑n

​g(i

−1)⋅

g(n−

i)為了計算函式結果,我們從小到大計算,因為g(n

)g(n)

g(n)

的值依賴於g(0

)…g(

n−1)

g(0)…g(n−1)

g(0)…g

(n−1

)。根據以上的分析和公式,很容易實現計算g(n

)g(n)

g(n)

的演算法。 下面是示例:

public

class

solution

}return g[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 左子樹 右子樹 在...