Skip to main content

95.不同的二叉搜索树 II

标签: dynamic-programming, tree, binary-search-tree, backtracking

难度: Medium

通过率: 59.27%

原题链接: https://leetcode.com/problems/unique-binary-search-trees-ii/description/

题目描述

给定一个整数 nn,返回所有包含 11nn 节点的唯一二叉搜索树(BST)。请按任意顺序返回答案。

解题思路

为了生成所有独特的二叉搜索树,我们可以考虑使用递归和回溯的方法。对于一个给定的整数范围 1,2,,n1, 2, \ldots, n,选择其中的任何一个整数 ii 作为树的根节点,这样左子树可以形成于范围 1,2,,i11, 2, \ldots, i-1,右子树形成于范围 i+1,,ni+1, \ldots, n。通过递归的方法,我们可以为这两个子范围生成所有可能的子树,然后将每一种左子树和右子树组合,形成以 ii 为根的唯一BST。递归终止于子范围为空,此时我们返回null来表示树的终止。

代码实现

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

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 []

def build_trees(start, end):
trees = []
if start > end:
trees.append(None)
return trees

for i in range(start, end + 1):
# 所有左子树
left_trees = build_trees(start, i - 1)
# 所有右子树
right_trees = build_trees(i + 1, end)

# 将每种左子树和右子树组合
for left in left_trees:
for right in right_trees:
root = TreeNode(i)
root.left = left
root.right = right
trees.append(root)
return trees

return build_trees(1, n)

复杂度分析

  • 时间复杂度:O(nCn)O(n \cdot C_n),其中 CnC_n 是卡塔兰数。
  • 空间复杂度:O(nCn)O(n \cdot C_n),用于存储中间结果的空间。