給定乙個整數
n,生成所有由 1 ...
n為節點所組成的
二叉搜尋樹
。這道題目是基於
不同的二叉搜尋樹
進行改進的;
對於連續整數序列
[left, right]
中的一點 i,若要生成以 i 為跟結點的bst,則有如下的規律:
一旦left
大於
right
,則說明這裡無法產生子樹,所以此處應該是作為空結點返回;
classsolution(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 ...