leetcode 每日一题 95. 不同的二叉搜索树 II
递归
思路:
按照96. 不同的二叉搜索树方式,从1..n中取出数字i,作为当前树的树根,1..i-1作为左子树,i+1....n作为右子树,会产生G(i-1)种左子树,G(n-i)种右子树,对1...i-1和i+1...n重复上述过程构建所有的左右子树,最后对将左右子树接入到根节点上即可。
例如:
n=3,序列 1,2,3
根节点为1时:
左子树只有一种情况为空,即[null]
右子树的序列为2,3:
右子树根节点为2时:
右子树的左子树为空,即[null]
右子树的右子树序列为3:
右子树的右子树根节点为3时:
其左右子树均为[null]
开始循环将左右子树拼接到根节点即 3:[null,null]
右子树根节点为2时,拼接左右子树:
2:[null,3]
右子树根节点为3时:
右子树的右子树为空,即[null]
右子树的左子树序列为2:
右子树的左子树根节点为2时:
其左右子树均为[null]
开始循环将左右子树拼接到根节点即2:[null,null]
右子树根节点为3时,拼接左右子树:
3:[2,null]
根节点为1时,拼接左右子树:
1:[null,2] -> [1,null,2,null,3]
1:[null,3] -> [1,null,3,2,null]
根节点为2时:
继续上面一系列递归再拼接得
2:[1,3] - > [2,1,3]
根节点为3时:
继续上面一系列递归再拼接得
3:[1,null] -> [3,1,null,null,2]
3:[2,null] -> [3,2,null,1,null]
代码:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def generateTrees(self, n: int) -> List[TreeNode]: def generate_trees(start, end): if start > end: return [None] all_trees = [] for i in range(start, end + 1): left_trees = generate_trees(start, i - 1) right_trees = generate_trees(i + 1, end) for l in left_trees: for r in right_trees: current_tree = TreeNode(i) current_tree.left = l current_tree.right = r all_trees.append(current_tree) return all_trees return generate_trees(1, n) if n else []