给定一个整数 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)