Leetcode之unique-binary-search-trees

原创 2016年05月30日 22:14:06

题目描述:
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.
这里写图片描述

动态规划来解决这道题:
我设bsTreeNum[i]表示共有i个节点时,能产生的BST树的个数
n == 0 时,空树的个数必然为1,因此bsTreeNum[0] = 1
n == 1 时,只有1这个根节点,数量也为1,因此bsTreeNum[1] = 1
n == 2时,
bsTreeNum[2] = bsTreeNum[0] * bsTreeNum[1] +bsTreeNum[1] * bsTreeNum[0]
n == 3时,
bsTreeNum[3] = bsTreeNum[0] * bsTreeNum[2] + bsTreeNum[1] * bsTreeNum[1] +bsTreeNum[2] * bsTreeNum[0]
同时,当根节点元素为 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

我们得到了递推关系式,这是解决DP问题的关键!!!!

package suda.alex.leetcode;

import java.util.Scanner;

public class UniqueBSTree {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        System.out.println("input n:");
        int n = scanner.nextInt();
        System.out.println("the number of BST is:" + numTrees(n));
    }
    public static int numTrees(int n) {
        if(n == 0){
            return 1;
        }
        int[] bsTreeNum = new int[n+1];
        bsTreeNum[0] = 1;
        bsTreeNum[1] = 1;
        for(int i=2;i<=n;i++){
            for(int j=0;j<i;j++){
                bsTreeNum[i] += bsTreeNum[j]*bsTreeNum[i-j-1];
            }
        }
        return bsTreeNum[n];

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

【博文总目录>>>】 LeetCode算法题典   LeetCode是一个准备面试非常有用的网站,是非常值得去的地方,里面都是一些经典的面试题,这些题目在Google,Microsof...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月16日 06:27
  • 24696

LeetCode 问题汇总(算法,难度,频率)

Id Question Difficulty Frequency Data Structures Algorithms 1 T...
  • sbitswc
  • sbitswc
  • 2014年03月13日 11:58
  • 12088

[LeetCode刷题笔记] 关于LeetCode的前言

又到了一年毕业就业季了,三年前的校招季我逃避了,可这一次终于还是要轮到我了=_=||。 作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢? LeetCode收录了许多互联网...
  • tostq
  • tostq
  • 2016年07月22日 21:32
  • 2987

leetcode解题总结(持续更新)

树型:DFS或BFS(不够+状态存储,缩短时间)(如数位DP,就是DFS+状态存储) 链表:多用two pointer 无序数组:hash映射(O(1),map,set等),并查集,字典树tire 有...
  • ChinaJane163
  • ChinaJane163
  • 2016年09月21日 20:53
  • 608

[leetcode]--刷leetcode算法目录和算法总结目录

这篇博文是记录所有刷leetcode算法的目录以及全部源码的github地址:所有代码的github地址:https://github.com/leetcode-hust/leetcode/tree/...
  • u010853261
  • u010853261
  • 2017年02月02日 07:54
  • 1009

LeetCode 题目总结/分类

注:此分类仅供大概参考,没有精雕细琢。有不同意见欢迎评论~利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/h...
  • yangliuy
  • yangliuy
  • 2015年03月21日 11:29
  • 7376

leetcode中,代码如何调试,创造本地运行环境

初次接触leetcode,是我在一个招聘网站上看的,这个OJ真有那么厉害吗? 这几天在这个OJ上做了几道题,发现他的几个特点,1、题目不难(相对于ACM来说,我被ACM虐到至今无力),评判没那么苛刻...
  • bg2bkk
  • bg2bkk
  • 2014年07月08日 21:06
  • 6774

Leetcode五大常用算法

Leetcode的5大常用算法
  • x_r_su
  • x_r_su
  • 2016年09月07日 17:30
  • 663

leetcode 刷起!!!!

今天终于开始刷Leetcode了。            开始用的facebook账号登陆的,提示要发送验证邮箱通过验证之后才能在上面跑代码,坑的是,我点了一下,提示发送成功,一分钟邮箱没有...
  • qq_21071767
  • qq_21071767
  • 2015年09月15日 20:25
  • 1063

LeetCode最常见的面试笔试题总结

找了一段时间的实习,总结一下LeetCode上面试出现频率比较高的题,只总结一部分,后续还会继续更新。一、Two Sum题意是给出一个数组,输出和为k的两个数。数组为无序的。 这道题的解题思路是先把...
  • u014486880
  • u014486880
  • 2016年04月26日 23:55
  • 8245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode之unique-binary-search-trees
举报原因:
原因补充:

(最多只允许输入30个字)