LeetCode 95 不同的二叉搜索树II

LeetCode 95 不同的二叉搜索树II

问题描述:
给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树

执行用时:1 ms, 在所有 Java 提交中击败了99.97%的用户
内存消耗:40.4 MB, 在所有 Java 提交中击败了49.34%的用户

class Solution {
    public List<TreeNode> generateTrees(int n) {
        if(n==0) return new ArrayList<TreeNode>();
        List<TreeNode> ans = generateTrees(1, n);
        return ans;
    }

    //产生[start, end] (satrt>=1, end<=n, start<=end) 范围内所有节点组成的二叉搜索树集合
    public List<TreeNode> generateTrees(int start, int end) {
        List<TreeNode> ans = new ArrayList<TreeNode>();
        //递归终止(空树、单节点)
        if(start > end) {
            ans.add(null);
            return ans;
        }

        //(记忆化, 需要记录[i,j]范围内的子树集合, 一共有n(n+1)/2个)递归过程
        for(int rootVal=start; rootVal<=end; rootVal++){
            //获取左右子树集合
            List<TreeNode> leftTreesList = generateTrees(start, rootVal-1);
            List<TreeNode> rightTreesList = generateTrees(rootVal+1, end);
            //拼接
            for(int i=0; i<leftTreesList.size(); i++){
                for(int j=0; j<rightTreesList.size(); j++){
                    TreeNode root = new TreeNode(rootVal);
                    root.left = leftTreesList.get(i);
                    root.right = rightTreesList.get(j);
                    ans.add(root);
                }
            }

        }

        //返回值
        return ans;

    }
}
posted @ 2020-08-31 09:48  CodeSPA  阅读(98)  评论(0编辑  收藏  举报