动态规划 + 笛卡尔积,背就完了
F(i)表示以i为根结点的不同二叉搜索树的全部数量,G(n)表示由n个结点组成的不同二叉搜索树的全部数量,相乘表示笛卡尔积,比如由2个结点组成的不同左子树,与由3个结点组成的不同右子树,以及由3个结点组成的不同左子树,与由2个结点组成的不同右子树,他们的全部组合
下式不能直接带入代码中,因为G(n)是从2个结点开始累加, G(n - 1)不符合
// g(3) += g(0)*g(2)
// g(3) += g(1)*g(1)
// g(3) += g(2)*g(0)
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}