此题与卡特兰数有关
令h(0)=1,h(1)=1,catalan数满足递推式 :
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
例如h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5,相当于左子树为n=0时的方法数*右子树为n=2时的方法数(根节点为1)+左子树为n=1时的方法数*右子树为n=1时的方法数(根节点为2)+左子树为n=2时的方法数*右子树为n=0时的方法数(根节点为3)
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0] = 1;
dp[1] = 1;
for(int i=2;i<=n;i++)
for(int j = 0;j<i;j++)
dp[i]+=dp[j]*dp[i-j-1];
return dp[n];
}