給定一個整數 n,生成全部由 1 ... n 爲節點所組成的二叉搜索樹。node
這道題目是基於不一樣的二叉搜索樹進行改進的;web
對於連續整數序列[left, right]
中的一點 i,若要生成以 i 爲跟結點的BST,則有以下的規律:app
i 左邊的序列能夠做爲左子樹結點,而且左兒子可能有多個,所以存在left_nodes = self.helper(left, i-1)
;ide
i 右邊的序列能夠做爲右子樹結點,而且右兒子可能有多個,所以存在right_nodes = self.helper(i+1, right)
;spa
產生的以當前結點 i 爲跟結點的BST樹有len(left_nodes) * len(right_nodes)
個,遍歷每一種狀況,便可以產生以 i 爲跟結點的BST序列,所以以 for 循環使得[left, right]
中每一個結點都能生成子樹序列;code
一旦left
大於right
,則說明這裏沒法產生子樹,因此此處應該是做爲空結點返回;orm
class Solution(object):
def generateTrees(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,則說明這裏沒法產生子樹,因此此處應該是做爲空結點返回
if left > right:
result.append(None)
return result
for i in 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)個,所以雙層遍歷
for left_node in left_nodes:
for right_node in right_nodes:
node = TreeNode(i)
node.left = left_node
node.right = right_node
result.append(node)
return result
def generateTrees(self, n):
"""
:type n: int
:rtype: List[TreeNode]
"""
if n <= 0:
return []
# 使用left,right表示左右兩邊結點對應個數的個數
result = defaultdict(list)
def helper(left, right):
if left > right:
return [None]
# 避免重複執行
if (left, right) in result:
return result[(left, right)]
for i in range(left, right+1):
left_nodes = helper(left, i-1)
right_nodes = helper(i+1, right)
# 包括產生的以當前結點 i 爲跟結點的BST樹有len(left_nodes) * len(right_nodes)個,所以雙層遍歷
for left_node in left_nodes:
for right_node in right_nodes:
node = TreeNode(i)
node.left = left_node
node.right = right_node
result[(left, right)].append(node)
return result[(left, right)]
return helper(1, n)