每次写回溯都写不太明白,以后写回溯的题都记录一下。
给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1 输出:[[1]]
二叉搜索树的性质是所有子树的根节点大于他的左子树所有的节点的值但是小于右子树所有节点的值。
我们定义 generateTrees(start, end) 函数表示当前值的集合为 [start,end],返回序列 [start,end] 生成的所有可行的二叉搜索树。按照上文的思路,我们考虑枚举 [start,end] 中的值 i 为当前二叉搜索树的根,那么序列划分为了 [start,i−1] 和 [i+1,end] 两部分。我们递归调用这两部分,即 generateTrees(start, i - 1) 和 generateTrees(i + 1, end),获得所有可行的左子树和可行的右子树,那么最后一步我们只要从可行左子树集合中选一棵,再从可行右子树集合中选一棵拼接到根节点上,并将生成的二叉搜索树放入答案数组即可。递归的入口即为 generateTrees(1, n),出口为当 start>end 的时候,当前二叉搜索树为空,返回空节点即可
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if(n == 0):
return []
def build_Trees(left,right):
all_trees=[]
if(left>right):
return [None]
for i in range(left,right+1):
left_trees=build_Trees(left,i-1)
right_trees=build_Trees(i+1,right)
for l in left_trees:
for r in right_trees:
cur_tree=TreeNode(i)
cur_tree.left=l
cur_tree.right=r
all_trees.append(cur_tree)
return all_trees
res=build_Trees(1,n)
return res