$dp[i] += dp[j] \times dp[i - j - 1];$

dp[i] 为总结点数为 i 时,该二叉搜索树有多少种互不相同的形态。

遍历 i ,除去根节点左右子树的结点之和为 i - 1 第二层循环 l0 ~ 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];
    }
};