計算二叉搜索樹的數量

題目描述

給定一個整數 n, 求以1 ... n為節點組成的二叉搜索樹有多少種? 示例:

輸入: 3

輸出: 5

解釋:

給定n = 3,一共有5種不同結構的二叉搜索樹,如下圖所示:

計算二叉搜索樹的數量

解題思路

首先要清楚什麼是二叉搜索樹, 如果一棵樹是二叉搜索樹, 那麼左子樹的所有節點的值小於根節點的值, 右子樹的所有節點大於根節點的值. 對於題目描述的問題:

當n = 1時, 有1種情況;

當n = 2時, 有2種情況;

當n = 3時, 有5種情況;

...

...

想找到關於n的通項公式嗎? 先看一下怎麼構造遞推關係吧. 設a(n)表示能組成的二叉搜索樹的個數, 那麼:

a(0) = 1(取a(0)方便計算);

a(1) = 1;

a(2) = 2;

a(3) = 5;

當n = 4時, 結果中按照根節點的不同可以分為根節點時1, 2, 3, 4四種情況. 以根節點取2為例, 其左子樹只能包含1, 右子樹只能包含3, 4. 並且左子樹的個數為a(1), 右子樹的個數為a(2), 根據乘法原理, 根節點取2時共有a(1)xa(2)種結果, 所以:

<code>a(4)=a(0)a(3)+a(1)a(2)+a(2)a(1)+a(3)a(0)/<code> 

對於任意一個大於1的整數n:

<code>a(n)=a(0)a(n-1)+a(1)a(n-2)+...+a(n-2)a(1)+a(n-1)a(0)/<code>

根據以上遞推公式即可計算出n取任意值時的結果.

代碼實現

<code>class Solution:
def numTrees(self, n: int) -> int:
# 保存遞推初始值
res = [1, 1, 2, 5]
if n <= 3:
return res[n]
else:
for i in range(4, n+1):
s = 0
for j in range(0, i):
s += (res[j] * res[i-1-j])
res.append(s)
return res[-1]/<code>

更多leetcode題解敬請期待。

計算二叉搜索樹的數量


分享到:


相關文章: