dp
- 由于是搜索树,所以左子树所有的值都比当前节点小,右节点所有值都比当前节点大
- 当n个节点时,从1到n都有可能当根结点,那么假设i为根结点时,左子树所有节点必是1到i - 1,右子树节点必是i + 1到n。
- 根为 i 的所有二叉搜索树的集合是左子树集合和右子树集合的笛卡尔积
// 1 2 3 4 5 6 7 8 9
// j i n
class Solution {
public int numTrees(int n) {
// dp[n]表示恰由n个节点组成互不相同的二叉搜索树有多少种
int[] dp = new int[n + 1];
dp[0] = 1;
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];//dp与节点值无关
}
}
return dp[n];
}
}