96. Unique Binary Search Trees

96. Unique Binary Search Trees

My Submissions
Question
Total Accepted: 75913  Total Submissions: 205774  Difficulty: Medium

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

Hide Tags
  Tree Dynamic Programming
Hide Similar Problems
  (M) Unique Binary Search Trees II

分析:
这个问题被提示为动态规划问题,所以必须努力去找到和以前的子问题的联系。
断言:由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)

借用网上一张图片。

<LeetCode OJ> 96. Unique Binary Search Trees_第1张图片

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

你可能感兴趣的:(LeetCode,数据结构,C++,算法,面试)