LeetCode ---- 95、不同的二叉搜索树 II

题目链接

思路:

题目要求构建节点值从1~n的所有的二叉搜索树,那么就必须要确保任何一棵子树的左子树 < 根 < 右子树

从1~n中,对于任意一个值,比如2来说,1只能作为它的左子树,从3开始到n都是2的右子树,但是右子树怎么排布就变成了和2挑选左子树右子树同样的问题,通过递归解决就好

    public List<TreeNode> generateTrees(int n) {
        if (n == 0) {
            return new LinkedList<>();
        }
        return generateTrees(1, n);
    }
    private List<TreeNode> generateTrees(int start, int end) {
        List<TreeNode> ans = new LinkedList<>();
        if (start > end) {
            ans.add(null);
            return ans;
        }
        for (int i = start; i <= end; i++) {
            // 以i为根节点,产生所有的左子树
            List<TreeNode> subLeftTree = generateTrees(start, i - 1);
            // 以i为根节点,产生所有的右子树
            List<TreeNode> subRightTree = generateTrees(i + 1, end);
            // 将左子树和右子树的所有可能跟i进行连接
            for (TreeNode left : subLeftTree) {
                for (TreeNode right : subRightTree) {
                    TreeNode node = new TreeNode(i);
                    node.left = left;
                    node.right = right;
                    ans.add(node);
                }
            }
        }
        return ans;
    }
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

代码参考自:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/comments/5409

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107347487