LeetCode95.不同的二叉搜索树 II

56 阅读1分钟

题目

给你一个整数 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;
    }
}