【力扣】95.不同的二叉搜索树
题目:
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
思路:
左子树的值都小于根节点,右子树的值都大于根节点。
首先来计数需要构建的二叉树数量。可能的二叉搜素数数量是一个 卡特兰数
我们从序列 1 ..n
中取出数字 i
,作为当前树的树根。于是,剩余 i - 1
个元素可用于左子树,n - i
个元素用于右子树。
这样会产生 G(i - 1)
种左子树 和 G(n - i)
种右子树,其中 G
是卡特兰数。
现在,我们对序列 1 ... i - 1
重复上述过程,以构建所有的左子树;然后对 i + 1 ... n
重复,以构建所有的右子树。
这样,我们就有了树根 i
和可能的左子树、右子树的列表。
最后一步,对两个列表循环,将左子树和右子树连接在根上。
代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def generateTrees(self, n: int) -> List[TreeNode]:
if n == 0:
return []
return self.gen_trees(1, n)
def gen_trees(self, start, end):
if start > end:
return [None]
all_trees = []
for i in range(start, end+1):
left = self.gen_trees(start, i-1)
right = self.gen_trees(i+1, end)
for l in left:
for r in right:
current_trees = TreeNode(i)
current_trees.left = l
current_trees.right = r
all_trees.append(current_trees)
return all_trees
注意递归的思路,还是需要多加锻炼!
作者:LeetCode
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/solution/bu-tong-de-er-cha-sou-suo-shu-ii-by-leetcode/