题目
给你一个整数 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]]
题解
public class LeetCode95 {
public static void main(String[] args) {
int n = 3;
System.out.println("生成所有不同的BST,n=" + n);
List<TreeNode> trees = GenerateBSTs.generateTrees(n);
System.out.println("\n最终生成的BST列表:");
for (int i = 0; i < trees.size(); i++) {
System.out.printf("BST %d: %s\n", i + 1, trees.get(i));
}
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
// 辅助方法:生成树结构的字符串表示(用于日志)
@Override
public String toString() {
if (left == null && right == null) return String.valueOf(val);
return String.format("[%d, left=%s, right=%s]", val, left, right);
}
}
class GenerateBSTs {
public static List<TreeNode> generateTrees(int n) {
System.out.printf("开始生成 1 到 %d 的所有BST...\n", n);
if (n == 0) {
System.out.println("n=0,返回空列表");
return new ArrayList<>();
}
return generateTrees(1, n);
}
private static List<TreeNode> generateTrees(int start, int end) {
System.out.printf("生成范围 [%d, %d] 的BST\n", start, end);
List<TreeNode> res = new ArrayList<>();
if (start > end) {
System.out.printf("范围 [%d, %d] 无效,添加 null 表示空子树\n", start, end);
res.add(null);
return res;
}
for (int i = start; i <= end; i++) {
System.out.printf("以 %d 为根节点,左子树范围 [%d, %d],右子树范围 [%d, %d]\n",
i, start, i - 1, i + 1, end);
// 递归生成左子树和右子树的所有可能结构
List<TreeNode> leftTrees = generateTrees(start, i - 1);
List<TreeNode> rightTrees = generateTrees(i + 1, end);
System.out.printf("左子树列表大小: %d,右子树列表大小: %d\n",
leftTrees.size(), rightTrees.size());
// 组合所有可能的左右子树
for (TreeNode left : leftTrees) {
for (TreeNode right : rightTrees) {
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
System.out.printf("生成树: %s\n", root);
res.add(root);
}
}
}
System.out.printf("范围 [%d, %d] 的BST生成完成,共 %d 种结构\n", start, end, res.size());
return res;
}
}