不同的二叉搜索树Ⅱ
题目
题目描述
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 8
题解
为了生成所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树(BST),我们可以使用递归和回溯的方法。这个问题可以通过递归地选择每个可能的根节点,然后分别构建左子树和右子树来解决。
解题思路
对于范围 [1, n]
中的每一个数 i
,我们可以把它作为当前树的根节点,那么:
- 所有可能的左子树是通过递归调用
[1, i-1]
获得的。 - 所有可能的右子树是通过递归调用
[i+1, n]
获得的。
我们将这两个结果集合并,并将每一对左子树和右子树与当前根节点组合起来,形成一个完整的二叉搜索树。
Python 实现代码
首先,定义一个辅助函数来生成指定范围内所有可能的二叉搜索树。然后,在主函数中调用这个辅助函数并传入初始参数。
python
def generateTrees(n: int):
if n == 0:
return []
def generate_trees(start, end):
if start > end:
return [None,]
all_trees = []
for i in range(start, end + 1): # 尝试每个数字作为根节点
# 获取所有可能的左子树
for left in generate_trees(start, i - 1):
# 获取所有可能的右子树
for right in generate_trees(i + 1, end):
# 创建当前树并加入到列表
current_tree = TreeNode(i)
current_tree.left = left
current_tree.right = right
all_trees.append(current_tree)
return all_trees
return generate_trees(1, n)
注意事项
- 当
n = 0
时,没有节点可以用来构建树,因此返回空列表。 - 使用了深度优先搜索(DFS)的思想,通过递归来遍历所有可能性。
- 该算法的时间复杂度较高,因为对于每一个节点都要考虑它作为根节点的情况,并递归处理其左右子树。但是由于题目限制了
1 <= n <= 8
,这种方法在实际应用中是可行的。