95. 不同的二叉搜索树 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

解答

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<TreeNode> generateTrees(int n) {
        return generateBSTs(1, n);
    }

    public List<TreeNode> generateBSTs(int start, int end) {
        List<TreeNode> treeList = new ArrayList<>();
        if (start > end) return treeList;
        // 以1-n进行遍历,对原数组进行分隔
        for (int i = start; i <= end; i++) {
            List<TreeNode> leftTrees = generateBSTs(start, i-1);
            List<TreeNode> rightTrees = generateBSTs(i+1, end);
            if (leftTrees.isEmpty()) {
                if (rightTrees.isEmpty()) treeList.add(new TreeNode(i));
                else
                    for (TreeNode right : rightTrees)
                        treeList.add(new TreeNode(i, null, right));
            } else if (rightTrees.isEmpty()) {
                for (TreeNode left : leftTrees)
                    treeList.add(new TreeNode(i, left, null));
            }
            for (TreeNode left : leftTrees)
                for (TreeNode right : rightTrees)
                    treeList.add(new TreeNode(i, left, right));
        }
        return treeList;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容