$dp[i] += dp[j] \times dp[i - j - 1];$
dp[i] 为总结点数为 i 时,该二叉搜索树有多少种互不相同的形态。
遍历 i ,除去根节点左右子树的结点之和为 i - 1 第二层循环 l 从 0 ~ i - 1, 这样遍历了所有左右子树组合
class Solution {
public:
int numTrees(int n) {
vector<int> f(n + 1);
f[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
f[i] += f[j] * f[i - j - 1];
}
}
return f[n];
}
};
class Solution {
public:
int numTrees(int n) {
vector<int> f(n + 1);
f[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
int left = j - 1; // the number of nodes in the left sub-BSTree
int right = i - left - 1;
f[i] += f[left] * f[right];
}
}
return f[n];
}
};