Leetcode 之 Unique Binary Search Trees

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树,BST(Binary Search Tree),二叉查找树;

性质:
若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
该结点的左、右子树也分别为二叉查找树;

也就是说BST树的中序遍历是递增的。

这道题就是给出节点,找到BST树有几种形式。

开始考虑就是用DP的思想,先列出了f(1)和f(2)的情况。然后思考怎么转移到f(3)的状态,只要固定住根节点,然后将剩下的节点在左右节点分配就行,分配的问题就能够用f(2)来求解了。所以会得出一张表,记录从f(1)到f(n-1)的种数,f(n)就可以直接计算出来了:
f(3) = f(0)f(2) + f(1)f(1) + f(0)(2)

public int numTrees(int n) {
        int[] arrays = new int[n + 1];

        arrays[0] = 1;
        arrays[1] = 1;
        arrays[2] = 2;

        for(int i = 3;i <= n;i++){

                for(int j = 0;j < i;j++){
                    arrays[i] += arrays[j] * arrays[i - j - 1];
                }
            }

        return arrays[n];
    }

19 / 19 test cases passed.
Status: Accepted
Runtime: 228 ms

Unique Binary Search Trees II是要在I的基础上再输出树的形状,同样用DP方法解,把问题分解为根节点、左子树和右子树。比根节点小的都放在左子树,大的放在右子树,用递归建树即可。子树的构建调用DP生成的树表。

     public List<TreeNode> generateTrees(int n) {
         return createTree(1, n);
     }

     public List<TreeNode> createTree(int start, int end){
         List<TreeNode> resultList = new ArrayList<TreeNode>();

         if(start > end){
             resultList.add(null);
             return resultList;
         }

         for(int k = start;k <= end;k++){
             List<TreeNode> left = createTree(start, k - 1);    //left tree
             List<TreeNode> right = createTree(k + 1, end); //right tree

             for(int i = 0;i < left.size();i++){
                 for(int j = 0;j < right.size();j++){
                     TreeNode root = new TreeNode(k);
                     root.left = left.get(i);
                     root.right = right.get(j);
                     resultList.add(root);
                 }
             }
         }

         return resultList;
     }

9 / 9 test cases passed.
Status: Accepted
Runtime: 292 ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值