class Solution {
public:
int numTrees(int n)
{
vector<int> dp(n+1);
dp[0] = 1;
dp[1] = 1;
for(int i = 2;i <= n;i++)
{
for(int j = 1;j <= i;j++) // 当根节点为j时
{
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
};
/* dp[i] = i个不同的数组成的二叉搜索数的个数
假设 i = 5
当根节点等于 1 时 ,其余数字都比1大,只能在右边 dp[i] += dp[4]
当根节点等于 2 时,左边有一个1比2小,右边有三个比2大的数字 dp[i] += dp[1] * dp[3]
当根节点等于 3 时,左边有两个数比3小,右边有两个数比3大的数字 dp[i] += dp[2] * dp[2]
...
直到根节点等于5,左边有4个数字比5小,只能放在5的左边,dp[i] += dp[4]
*/