95 不同的二叉搜尋樹 II

2022-01-23 02:08:29 字數 1960 閱讀 2954

給定乙個整數

n,生成所有由 1 ...

n為節點所組成的

二叉搜尋樹

。這道題目是基於

不同的二叉搜尋樹

進行改進的;

對於連續整數序列

[left, right]中的一點 i,若要生成以 i 為跟結點的bst,則有如下的規律:

一旦left大於

right,則說明這裡無法產生子樹,所以此處應該是作為空結點返回;

class

solution(object):

defgeneratetrees(self, n):

""":type n: int

:rtype: list[treenode]

"""if

n<= 0:

return

​return

self.helper(1, n)

​def

helper(self, left, right):

result =

# 一旦left大於right,則說明這裡無法產生子樹,所以此處應該是作為空結點返回

ifleft

>

right:

return

result

​foriin

range(left, right

+1):

left_nodes = self.helper(left, i-1)

right_nodes = self.helper(i

+1, right)

# 包括產生的以當前結點 i 為跟結點的bst樹有len(left_nodes) * len(right_nodes)個,因此雙層遍歷

forleft_node

inleft_nodes:

forright_node

inright_nodes:

node = treenode(i)

node.left = left_node

node.right = right_node

​return

result

defgeneratetrees(self, n):

""":type n: int

:rtype: list[treenode]

"""if

n<= 0:

return

# 使用left,right表示左右兩邊結點對應個數的個數

result = defaultdict(list)

defhelper(left, right):

ifleft

>

right:

return [none]

# 避免重複執行

if (left, right) in

result:

return

result[(left, right)]

fori

inrange(left, right

+1):

left_nodes = helper(left, i-1)

right_nodes = helper(i

+1, right)

# 包括產生的以當前結點 i 為跟結點的bst樹有len(left_nodes) * len(right_nodes)個,因此雙層遍歷

forleft_node

inleft_nodes:

forright_node

inright_nodes:

node = treenode(i)

node.left = left_node

node.right = right_node

return

result[(left, right)]

return

helper(1, n)

95 不同的二叉搜尋樹 II

二叉搜尋樹,又被稱為是二叉查詢樹 二叉排序樹,這種樹其左子樹所有節點的值均小於根節點的值,其右子樹所有節點的值均大於根節點的值,並且其左 右子樹均為二叉搜尋樹。空樹也是二叉搜尋樹。方法一 遞迴法 與這道題類似的是那道 96不同的二叉搜尋樹 在96中我們曾分析到,由於給定的節點值為1 n,是一組從小到...

95 不同的二叉搜尋樹 II

給定乙個整數 n,生成所有由 1 n 為節點所組成的二叉搜尋樹。示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 ...

95 不同的二叉搜尋樹 II

給定乙個整數 n,生成所有由 1 n 為節點所組成的二叉搜尋樹。示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 ...