leetcode 96 不同的二叉搜尋樹

2021-09-25 16:46:39 字數 1907 閱讀 6307

——————————————————————————————————————————

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

示例:——————————————————————————————————————————

這裡首先說一下什麼是二叉搜尋樹,二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。

——————————————————————————————————————————

1、動態規劃

給定乙個有序序列 1 … n,為了根據序列構建一棵二叉搜尋樹。我們可以遍歷每個數字 i,將該數字作為樹根,1 … (i-1) 序列將成為左子樹,(i+1) … n 序列將成為右子樹。於是,我們可以遞迴地從子串行構建子樹。 在上述方法中,由於根各自不同,每棵二叉樹都保證是獨特的。

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

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

g(n): 長度為n的序列的不同二叉搜尋樹個數。

f(i, n): 以i為根的不同二叉搜尋樹個數(1≤i≤n)。

可見,g(n)g(n) 是我們解決問題需要的函式。稍後我們將看到,g(n)g(n) 可以從 f(i, n)f(i,n) 得到,而 f(i, n)f(i,n) 又會遞迴的依賴於 g(n)g(n)。

首先,根據上一節中的思路,不同的二叉搜尋樹的總數 g(n)g(n),是對遍歷所有 i (1 <= i <= n) 的 f(i, n)f(i,n) 之和。換而言之:

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

給定序列 1 … n,我們選出數字 i 作為根,則對於根 i 的不同二叉搜尋樹數量 f(i, n)f(i,n),是左右子樹個數的笛卡爾積,如下圖所示:

舉例而言,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), 從 [4, 5, 6, 7]` 構建不同右子樹的數量表示為 g(4)g(4)。這是由於 g(n)g(n) 和序列的內容無關,只和序列的長度有關。於是,f(3,7) = g(2) \cdot g(4)f(3,7)=g(2)⋅g(4)。 概括而言,我們可以得到以下公式:

將公式 (1),(2) 結合,可以得到 g(n)g(n) 的遞迴表達公式:

為了計算函式結果,我們從小到大計算,因為 g(n)g(n) 的值依賴於 g(0) … g(n-1)g(0)…g(n−1)。

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

class solution 

}return num[n];}};

leetcode 96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3n 0 表示,有0個點,那麼,可以組成的二叉查詢樹就乙個,那就是空樹 n 1表示,有1個點,那麼...

Leetcode 96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3主要參考 本題其實是構造卡特蘭數的應用,採用動態規劃思想求解。通過求解出子問題來實現最終問題的求...

leetcode96 不同的二叉搜尋樹

給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3 我們把n 0 時賦為1,因為空樹也算一種二叉搜尋樹,假設n個節點存在二叉排序樹的個數是g n ...