leetcode96 不同的二叉搜尋樹

2021-10-05 23:39:39 字數 1197 閱讀 9737

傳送門

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

示例: 輸入: 3 輸出: 5

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

1         3     3     2     1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

方法1. 動態規劃

給定乙個序列1…n,為了構造所有二叉樹,我們可以使用1…n中的每乙個數i作為根節點,自然1…(i-1)必然位於樹的左子樹中,(i+1)…n位於樹的右子樹中。然後可以遞迴來構建左右子樹,由於根節點i每次遞迴都是不同的,所以可以保證每次構建的二叉樹都是唯一的。

使用兩個狀態來記錄:

g(n):長度為n的序列的所有的bst。

f(i),1<=i<=n:以i作為根節點的bst的數量。

g(n)就是我們要求解的答案,g(n)可以由f(i)計算而來。

g(n)=f(1)+f(2)+…+f(n) ; g(0)=1, g(1)=1

對於給定的乙個序列1…n,我們取i作為它的根節點,

那麼以i作為根節點的二叉樹的數量f(i)可以由下面的公式計算而來:

f(i)=g(i-1)*g(n-i) 1<=i<=n

這個公式帶入上面:

g(n) = g(0) * g(n-1) + g(1) * g(n-2) + … + g(n-1) * g(0), g(n)就是答案

g(n)是對稱的, 不用擔心算f(i) 時 g(i-1)或者g(n-i)沒有提前被計算出來

public

intnumtrees

(int n)

}return dp[n]

;}

每一次的 dp[j-1]*dp[len-j] 計算出來一次 f(j)

裡層的for迴圈 和 dp[len]累加 組合起來 相當於: g(n)=f(1)+f(2)+…+f(n)

方法2 卡特蘭數

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 ...