给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树.
//动态规划
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1, 0);
dp[0] = dp[1] = 1;
for(int i = 2; i <= n; i++)
for(int j = 1; j <= i; j++)
dp[i] += dp[j-1] * dp[i-j];
return dp[n];
}
};
//记忆化搜索
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1, -1);
return buildTree(n, dp);
}
private:
int buildTree(int n, vector<int>& dp){
if( n <= 1 )
return 1;
if( dp[n] != -1 )
return dp[n];
int res = 0;
for(int i = 1; i <= n; i++)
res += buildTree(i-1, dp) * buildTree(n-i, dp);
return dp[n] = res;
}
};