二叉树系列---求包含n个节点的二叉查找树的种类数

题目1

求包含n个节点的二叉查找树的种类数;

方法1

设dp[i]表示共有i个节点时,能产生的BST树的个数
n == 0 时,空树的个数必然为1,因此dp[0] = 1
n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1
当根节点元素为 1, 2, 3, 4, 5, …, i, …, n时,基于以下原则的BST树具有唯一性:
以i为根节点时,其左子树构成为[0,…,i-1],其右子树构成为[i+1,…,n]构成
因此,dp[i] = sigma(dp[0…k] * dp[k+1…i]) 0 <= k < i – 1

public int numTrees(int n) {
        if(n==0||n==1){
            return 1;
        }
        int[] nums=new int[n+1];
        nums[0]=1;
        nums[1]=1;

        for(int i=2;i<=n;i++){
            int sum=0;
            for(int j=0;j<=i-1;j++){
                sum+=nums[j]*nums[i-j-1];
            }
            nums[i]=sum;
        }

        return nums[n];
    }

方法2

选择一个节点,它的左右子树个数的乘积就是总的个数,可以递归解决

public int numTrees2(int n) {
        if(n<1){
            return 1;
        }
        int sum=0;
        for(int i=1;i<=n;i++){
            sum+=numTrees2(i-1)*numTrees2(n-i);
        }
        return sum;
    }

题目2

求包含n个节点(从1到n,n个节点)的所有二叉查找树;(不是求个数,而是求所有二叉查找树);

思路

/*
* 每次选取一个结点为根(从1到n依次作为根),然后递归求解左右子树的所有结果,
* 最后根据左右子树的返回的所有子树,依次选取
* 然后接上(每个左边的子树跟所有右边的子树匹配,
* 而每个右边的子树也要跟所有的左边子树匹配,总共有左右子树数量的乘积种情况),
* 构造好之后作为当前树的结果返回
*/

实现

public ArrayList<TreeNode> generateTrees(int n) {
        return createTrees(1,n);
    }
/* * 每次选取一个结点为根(从1到n依次作为根),然后递归求解左右子树的所有结果, * 最后根据左右子树的返回的所有子树,依次选取 * 然后接上(每个左边的子树跟所有右边的子树匹配, * 而每个右边的子树也要跟所有的左边子树匹配,总共有左右子树数量的乘积种情况), * 构造好之后作为当前树的结果返回 */
    private ArrayList<TreeNode> createTrees(int start, int end) {
        ArrayList<TreeNode> res=new ArrayList<TreeNode>();
        if(start>end){
            res.add(null);
            return res;
        }
        for(int i=start;i<=end;i++){//i作为根
            ArrayList<TreeNode> leftList=createTrees(start,i-1);
            ArrayList<TreeNode> rightList=createTrees(i+1,end);

            /*每个左边的子树跟所有右边的子树匹配,而每个右边的子树也要跟所有的左边子树匹配; * 总共有左右子树数量的乘积种情况 */
            for(TreeNode left:leftList){
                for(TreeNode right:rightList){
                    TreeNode root=new TreeNode(i); //i作为根
                    root.left=left;
                    root.right=right;
                    res.add(root);
                }
            }
        }
        return res;
    }
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/bh_xiaoxinba/article/details/53045611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞