96. Unique Binary Search Trees && 95. Unique Binary Search Trees II

本文探讨了如何使用动态规划方法计算从1到n能构造的不同二叉搜索树的数量,并提供了生成所有可能结构的二叉搜索树的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?

For example,
Given n = 3, there are a total of 5 unique BST’s.
这里写图片描述

分析:
BST,二分查找树。每一个节点,大于左子树,小于右子树,中序遍历是有序的。1~n能构造多少种不同的BST,可以用动态规划解决这个问题。用num[i]表示1~i能构造多少种不同的BST
首先,num[i]不仅代表1~i能构造多少种BST,也代表i个有序排列数字能有多少种BST。
其次num[i]的求法。num[i]=每一个数字作为根节点能构造的BST之和。
任一数字节点k =1~i 能构造的BST,左子树有k-1个节点,右子树有i-k个节点,分别能构造的子树个数为num[k-1]、num[i-k],则以k为根节点的BST为num[k-1]*num[i-k].递推关系确定。
最后,左子树有i个节点,右子树有j个节点,和右子树有i个节点,左子树有j个节点是一样的,k=1~i/2,和k = i/2+1~i 的计算存在对称性,不过根据奇偶有所不同。

 public int numTrees(int n) {
       if(n == 0) return 0;
        int[] num = new int[n+1];
        num[0] = 1;
        num[1] = 1;
        for(int i = 2;i <= n;i++){
            int total = 0;
            for(int j = 1;j <= i/2;j++){
                int tmp = 0;
                tmp = num[j-1] * num[i-j];
                total += tmp;
            }
            if(i % 2 == 0){
                num[i] = 2*total;
            }
            else{
                num[i] = 2*total+num[i/2]*num[i/2];
            }
        }
        return num[n];
    }

Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.

For example,
Given n = 3, your program should return all 5 unique BST’s shown below.
这题要返回构造的BST,所以就不同用DP了,用BFS解决

 public List<TreeNode> generateTrees(int n) {
        List<TreeNode> r = new ArrayList<TreeNode>();
        return generate(1,n);
    }
    private List<TreeNode> generate(int begin ,int end){
         List<TreeNode> r = new ArrayList<TreeNode>();
         if(begin > end){
             r.add(null);
             return r;
         }
         if(begin == end){
             TreeNode tmp = new TreeNode(begin);
             r.add(tmp);
             return r;
         }
         for(int i = begin;i <= end;i++){
             List<TreeNode> left = generate(begin,i-1);
             List<TreeNode> right = generate(i+1,end);
             for(int j = 0;j < left.size();j++)
                for(int k = 0;k < right.size();k++){
                    TreeNode tmp = new TreeNode(i);
                    tmp.left = left.get(j);
                    tmp.right = right.get(k);
                    r.add(tmp);
                }
         }
         return r;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值