给你一个整数
n
,请你生成并返回所有由n
个节点组成且节点值从1
到n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。示例:
分析:
观察样例,首先我们需要对所有的整数i均做当作根节点。将小于i的整数作为根节点的左子树,大于i的整数作为根节点的右子树。
因此我们需要设置第一重循环,以枚举我们需要遍历所有的整数作为我们的根节点。
同时,哪些节点可以当作左子树呢?我们同样需要枚举。不过观察一个细节。对于示例的最后一个图来说,2可以作为1的右子树,但同时,2在3的左子树的子树中。
因此我们可以用循环继续枚举左子树和右子树。
代码如下:
class Solution:
def generateTrees(self, n: int) -> List[Optional[TreeNode]]:
@cache
def dfs(l,r):
if l>r:
return [None]
ans = []
for i in range(l,r+1):
for x in dfs(l,i-1):
for y in dfs(i+1,r):
root = TreeNode(i)
root.left,root.right = x,y
ans.append(root)
return ans
return dfs(1,n)