给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
思路
假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数,则
当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i,则
综合两个公式可以得到卡特兰数公式
int numTrees(int n)
{
vector<int> dp(n + 1);
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];
}
动态规划题要注意从列出状态转移方程开始,不要忽视数学公式的推导过程