您的位置:首页 > 产品设计 > UI/UE

Unique Binary Search Trees

2016-07-08 09:51 429 查看
设C0 = 1,只有一个元素时可行的BST数量C1 = 1,有两个元素时可行的BST数量C2 = 2 ,C3 = C0*C2 + C1*C1 + C2*C0 , C4 =......

这就是卡特兰数的定义。

所以用动态规划来做。

然而这种规律太难找了,我更倾向于寻找有启发性的思路。

因为对于每一个节点,只有两种状态:作为根节点或不作为根节点,有二分的思想,然而很明显这道题不能用二分法做,同时想到二分法和动态规划的相似点(见我的另一篇博客http://blog.csdn.net/popvip44/article/details/51704994),所以考虑用动态规划来做。

即:

n == 0 时,空树的个数必然为1,因此dp[0] = 1 

n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1 

n == 2时,有两种构造方法,dp[2] = dp[0] * dp[1] + dp[1] * dp[0] (0为根节点,1为根节点)

n == 3时,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0] (0为根节点,2为子树根节点或者不为子树根节点; 1为根节点,因为1是mid位置,所以只有一种结构; 2为根节点,0为或不为子树根节点)

由卡特兰数计算公式得:

class Solution {
public:
int numTrees(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
vector<int> res(n+1,0) ;
res[0]=1;
res[1]=1;
for (int i = 2; i <=n; i++)
{
for (int j = 0; j<i; j++)
{
res[i] += res[j] * res[i - j-1];
}
}
return res.back();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: