class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1]; //dp[i]表示n个节点组成的二叉搜索数的种数
dp[1] = 1;
dp[0] = 1;
//递推公式:选定任意点i作为根节点,则左子树为[1,i-1];右子树为[i+1,n];
//dp[i] = ∑(dp[i-1] * dp[n-i])
// 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];
}
}