給定乙個整數 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 左子樹 右子樹 在...