题目:
题解:动态规划
分析当n=3时,有哪些情况:
当1为头结点时,右子树有两个结点,其也是二叉搜索树,布局应该和n=2两棵树一模一样(只看布局,不关心数值)
当2为头结点时,左右子树各一个结点,左右布局应该和n=1一模一样
当3为头结点,左子树有两个结点,布局和n=2的一模一样
分析到这里,其实就能找到规律,dp[3] 是由 dp[1] 和 dp[2] 推导而来。
dp[3] = 1为头结点的搜索树数量 + 2为头结点的搜索树数量 + 3为头结点的搜索树数量
1为头结点的搜索树数量 = 左子树0个结点的搜索树数量 * 右子树2个结点的搜索树数量
2为头结点的搜索树数量 = 左子树1个结点的搜索树数量 * 右子树1个结点的搜索树数量
2为头结点的搜索树数量 = 左子树2个结点的搜索树数量 * 右子树0个结点的搜索树数量
所以 dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]
递推关系:dp[i] += dp[以j为结点的左子树数量]*dp[以j为结点的右子树数量]
递推公式:dp[i] += dp[j-1]*dp[i-j],j 从1遍历到i
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
时间复杂度:O(n^2)