lintcode-163-不同的二叉查找树
163-不同的二叉查找树
给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?
样例
给出n = 3,有5种不同形态的二叉查找树:
标签
卡特兰数 动态规划
思路
参考博客http://blog.sina.com.cn/s/blog_5ce680a40102vqgu.html 的递推思路,使用卡特兰数,另外使用动态规划,使用一维数组 dp[i] 保存由 i 个节点组成的不同的二叉查找树的种类
卡特兰数的递推公式为:
f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0)
code
class Solution {
public:
/**
* @paramn n: An integer
* @return: An integer
*/
int numTrees(int n) {
// write your code here
if (n <= 0) {
return 1;
}
vector<int> dp(n + 1, 0);
dp[0] = dp[1] = 1;
for (int i = 2; i < n + 1; i++) {
for (int j = 1; j < i + 1; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
};