<LeetCode OJ> 96. 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.

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

分析:
这个问题被提示为动态规划问题,所以必须努力去找到和以前的子问题的联系。
断言:由1,2,3,...,n构建的二叉查找树,以i为根节点,左子树由[1,i-1]构成,其右子树由[i+1,n]构成。
定义子问题:定义f(i)为以[1,i]能产生的二叉搜索树的数目
若数组为空,则只有一种BST,即空树,f(0)=1;
若数组仅有一个元素1,单个节点,f(1)=1;
若数组有两个元素1,2,则有两种可能,f(2)=2;
若数组有三个元素1,2,3,则有5中情况,题目已经说了,
n=4呢?显示此问题玄机的时候到了:寻找与上面已推出子问题的关系:
如果1为根,则左子树0个元素所以1种情况,右子树3个元素(2,3,4),显然为5种情况
如果2为根,则左子树1个元素所以1种情况,右子树2个元素(3,4),显然为2
如果3为根,则左子树2个元素所以2种情况,右子树1个元素(4),显然为1
如果4为根,则左子树3个元素所以5种情况,右子树3个元素(无),显然为1
由此可以得到递推公式:f(i)=f(0)*f(i-1)+...+f(k-1)*f(i-k)+...+f(i-1)*f(0)

时间复杂度:O(n^2),空间复杂度:O(n)

借用网上一张图片。


class Solution {
public:
    int numTrees(int n) {
        vector<int> result(n+1,0);
        result[0]=1,result[1]=1;//初始化
        for(int i=2;i<=n;i++)
            for(int j=1;j<=i;j++)
                result[i]+=result[j-1]*result[i-j];
        return result[n];    
    }
};


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50752329

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值