[96]Unique Binary Search Trees

来源:互联网 发布:手机淘宝开不了店2017 编辑:程序博客网 时间:2024/05/22 00:32

【题目描述】

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

Subscribe to see which companies asked this question

【思路】

如果把上例的顺序改一下,就可以看出规律了。

  

比如,以1 为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是0 个元素的树,
右子树是2 个元素的树。以2 为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是1
个元素的树,右子树也是1 个元素的树。依此类推。
当数组为1; 2; 3; :::; n 时,基于以下原则的构建的BST 树具有唯一性:以i 为根节点的树,其左
子树由[1, i-1] 构成,其右子树由[i+1, n] 构成。
定义f(i) 为以[1; i] 能产生的Unique Binary Search Tree 的数目,则
如果数组为空,毫无疑问,只有一种BST,即空树,f(0) = 1。
如果数组仅有一个元素1,只有一种BST,单个节点,f(1) = 1。
如果数组有两个元素1,2,那么有如下两种可能

                                       s(2) = s(0) *s(1) ,1 为根的情况

                                                  + s(1) *s(0) ,2 为根的情况

再看一看3 个元素的数组,可以发现BST 的取值方式如下:
                             f(3) = s(0) *s(2) ,1 为根的情况
                                      + s(1)* s(1) ,2 为根的情况
                                      + s(2) *s(0) ,3 为根的情况
所以,由此观察,可以得出s 的递推公式为
           
至此,问题划归为一维动态规划。

【代码】

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


0 0
原创粉丝点击