码迷,mamicode.com
首页 > 其他好文 > 详细

Unique Binary Search Tree | LeetCode

时间:2014-10-21 11:53:17      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   java   for   sp   div   

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.

   1         3     3      2      1
    \       /     /      / \           3     2     1      1   3      2
    /     /       \                    2     1         2                 3

通过仔细分析题目的规律,我们发现可以尝试通过动态规划的方法去解决。假设f(n)表示不同的二叉搜索树的个数,假设二叉搜索树的根为k(1<=k<=n),左子树的个数为k-1个,右子树的个数为n-k,左右子树分别都是二叉搜索树,因此依照定义,左子树的不同个数为f(k-1),右子树的个数为f(n-k),则根为k时的不同的二叉搜索树的个数为f(k-1)f(n-k),考虑到k的取值氛围,则所有的二叉搜索树的个数为f(n)=∑f(k-1)f(n-k)(k=1,2,...,n)。
得到递归的公式之后,我们可以很容易的写出程序:
  Java:
public class Solution {
    public int numTrees(int n){
        int f[] = new int[n+1];
        f[0] = 1;
        for (int i = 1; i < f.length; i++)
        {
            for (int j = 1; j <= i; j++)
            {
                f[i] += f[j-1]*f[i-j];
            }
        }
        return f[n];
    }
}

   上面的程序是可以ac的,但是时间复杂度是O(n2),空间复杂度是O(n)。下面我们再介绍一种时间效率更高的方法,时间复杂度为O(n)。这里要引入一个叫Catalan(卡塔兰)数的概念,如果C(0)=1,C(1)=1,C(2)=2,...,C(n) = C(0)*C(n-1)+C(1)*C(n-2)+C(2)*C(n-2)+...+C(n-1)*C(0)=C(2n,n)/(n+1)  (n=0,1,2,3....)

   另类地推公式

                C(n) = C(n-1)*(4n-2)/(n+1)  (n=0,1,2,3....) 

   或者     C(n) = C(2n,n)-C(2n,n-1)  (n=0,1,2,3...)

   通过测试上面我们的几个例子发现,我们的所要求的二叉搜索树的个数就是卡塔兰数。

   Java:

 

public class Solution{
    public int numTrees(int n){
        int answer  = 1;
        for (int i = 1; i <= n; i++)
        {
            answer = (answer*(4*i-2))/(i+1);
        }
        return answer;
    }
}

 

 

 

 

Unique Binary Search Tree | LeetCode

标签:style   blog   color   io   ar   java   for   sp   div   

原文地址:http://www.cnblogs.com/capricore/p/4039752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!