不同的二叉搜索树 II
难度:
标签:
题目描述
给你一个整数 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
代码结果
运行时间: 60 ms, 内存: 16.8 MB
/*
* 思路:
* 1. 使用Stream API生成所有可能的二叉搜索树。
* 2. 主要使用flatMap和map来生成所有的树节点组合。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
// 树节点定义
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class UniqueBSTStream {
public List<TreeNode> generateTrees(int n) {
if (n == 0) return new ArrayList<>();
return generateTreesHelper(1, n);
}
private List<TreeNode> generateTreesHelper(int start, int end) {
if (start > end) {
return List.of((TreeNode) null);
}
return IntStream.rangeClosed(start, end)
.boxed()
.flatMap(i -> {
List<TreeNode> leftTrees = generateTreesHelper(start, i - 1);
List<TreeNode> rightTrees = generateTreesHelper(i + 1, end);
return leftTrees.stream()
.flatMap(left -> rightTrees.stream()
.map(right -> {
TreeNode currentTree = new TreeNode(i);
currentTree.left = left;
currentTree.right = right;
return currentTree;
}));
})
.collect(Collectors.toList());
}
}
解释
方法:
这个题解使用递归的方法来生成所有可能的二叉搜索树。主要思路是:对于从1到n的每个数i,将其作为根节点,然后递归生成所有可能的左子树(由小于i的数组成)和右子树(由大于i的数组成),最后将左右子树与根节点i组合起来,形成一棵完整的二叉搜索树。通过遍历1到n的每个数作为根节点,可以生成所有可能的二叉搜索树。
时间复杂度:
O(4^n / n^(3/2))
空间复杂度:
O(4^n / n^(3/2))
代码细节讲解
🦆
为什么在递归函数中,当start大于end时,返回的是包含None的列表而不是空列表?
▷🦆
递归生成左右子树时,如何保证生成的子树满足二叉搜索树的性质?
▷🦆
在递归过程中,是否有可能通过缓存或其他方式优化重复计算?
▷相关问题
不同的二叉搜索树
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:

输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
为运算表达式设计优先级
给你一个由数字和运算符组成的字符串 expression
,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。
生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过 104
。
示例 1:
输入:expression = "2-1-1" 输出:[0,2] 解释: ((2-1)-1) = 0 (2-(1-1)) = 2
示例 2:
输入:expression = "2*3-4*5" 输出:[-34,-14,-10,-10,10] 解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
提示:
1 <= expression.length <= 20
expression
由数字和算符'+'
、'-'
和'*'
组成。- 输入表达式中的所有整数值在范围
[0, 99]