Fork me on GitHub

【LeetCode】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

提示:

这道题可以用动态规划的思路解决。既然动态规划的核心是把问题拆分成子问题,考虑到BST的特性,我们可以得到如下推导公式:

F(i, n) = G(i-1) * G(n - i)

F(i, n)的含义是:以i为根节点,且总共有n个节点的树。例如F(2,3)就是说以2为根节点,总共有3个节点,那么其实就只有一种情况,即:

      2
     / \
    1   3

由于BST的特性,所以当树以i为节点时,左子树会有i-1个节点,右子树则会有n-i个节点,很容易联想到G(n)的含义为:总数为n个节点的BST有多少种可能,那么当我们将G(i-1) * G(n - i)相乘时,得到的就是左右子树总共可能的组合。

至此,dp的状态方程就已经很明了了。

代码:

 1 class Solution {
 2 public:
 3     int numTrees(int n) {
 4         vector<int> dp(n+1, 0);
 5         dp[0] = dp[1] = 1;
 6         dp[2] = 2;
 7         for (int i = 3; i <= n; ++i) {
 8             for (int j = 1; j <= i; ++j) {
 9                 dp[i] += dp[j-1] * dp[i-j];
10             }
11         }
12         return dp[n];
13     }
14 };

 

posted @ 2016-02-29 10:30  __Neo  阅读(203)  评论(0编辑  收藏  举报