题目描述:给定一个整数 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 2 / / \ \ 2 1 2 3
解法1。划分左右子树,递归构造。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def generateTrees(self, n):
"""
:type n: int
:rtype: List[TreeNode]
"""
if n == 0:
return []
return self.dfs(1, n)
def dfs(self, start, end):
if start>end:
return [None]
res = []
for rootVal in range(start, end+1):
leftTree = self.dfs(start, rootVal-1)
rightTree = self.dfs(rootVal+1, end)
for i in leftTree:
for j in rightTree:
node = TreeNode(rootVal)
node.left = i
node.right = j
res.append(node)
return res
解法2。用记忆搜索改良,用一个dict存储计算过的(start, end)的结果,避免重复计算
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def generateTrees(self, n):
"""
:type n: int
:rtype: List[TreeNode]
"""
if n == 0:
return []
memo = {}
self.dfs(1, n, memo)
return memo[(1, n)]
def dfs(self, start, end, memo):
if start>end:
return [None]
if (start, end) in memo:
return memo[(start,end)]
res = []
for rootVal in range(start, end+1):
leftTree = self.dfs(start, rootVal-1, memo)
rightTree = self.dfs(rootVal+1, end, memo)
for i in leftTree:
for j in rightTree:
node = TreeNode(rootVal)
node.left = i
node.right = j
res.append(node)
memo[(start, end)] = res
return res # 这个地方一定要有返回值,不然上面的leftTree和rightTree会得不到返回值
参考链接:https://blog.csdn.net/qq_17550379/article/details/84635060