欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不同的二叉搜索树

程序员文章站 2022-07-16 13:12:28
...

不同的二叉搜索树上来着实被吓了一跳。
定义一个数组 dp[i]用来表示i个节点可以定义多少种二叉树。
一棵二叉树有多少种定义方式:左孩子节点数的种类右孩子节点的种类根节点的个数
第二层循环表示i个节点时,第j个节点作为根节点的情况

public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<=n;i++){
            for(int j=0;j<i;j++){
                dp[i] += dp[j]*dp[i-j-1];
            }
        }
        return dp[n];    
        }

不同的二叉搜索树

public List<TreeNode> generateTrees(int n) {
        if(n==0) return new ArrayList<TreeNode>();
        return generate(1,n);
    }
    public List<TreeNode> generate(int a,int b){
        LinkedList<TreeNode> all_trees = new LinkedList<TreeNode>();
        if (a > b) {
            all_trees.add(null);
            return all_trees;
        }
        for(int i=a;i<=b;i++){
            List<TreeNode> left_trees = generate(a, i - 1);
            List<TreeNode> right_trees = generate(i + 1, b);
            for(TreeNode left: left_trees){
                for(TreeNode right:right_trees){
                    TreeNode current_tree = new TreeNode(i);
                    current_tree.left = left;
                    current_tree.right = right;
                    all_trees.add(current_tree);
                }
            }
        }
        return all_trees;
    }