题目:
题目链接: https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
解题思路:
如果只是求个数,可直接通过卡特兰数递推公式求解:
假设是卡特兰数的第n + 1项,则:
其中,
其他常见的符合卡特兰数递推公式的例子有:括号化、出栈次序、凸多边形三角划分、n对括号正确匹配数目
所以如果不需要列出所有的例子,只需要从0开始递推,就可以求出任意项的卡特兰数
但是此处需要列出所有例子,所以没办法使用此方法,需要使用递归的方式,遍历所有的可能性
递归时候的思路为:
- 选定一个数,作为当前节点值
- 使用小于当前值的数字递归调用自己,创建左子树
- 使用大于当前值的数字递归调用自己,创建右子树
- 向后移动一位作为当前节点值,继续重复循环
代码实现:
# 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]:
def create_res(start, end):
# 如果start > end,说明以及到了叶子节点,直接返回None
if start > end:
return [None,]
res = []
for i in range(start, end + 1):
# 创建左子树
left_trees = create_res(start, i - 1)
# 创建右子树
right_trees = create_res(i + 1, end)
for left in left_trees:
for right in right_trees:
# 如果是叶子节点,left和right都为None
# 之后再向上递归,逐渐创建一系列完整的树
node = TreeNode(i)
node.left = left
node.right = right
res.append(node)
return res
if 0 == n:
return []
return create_res(1, n)