96. 不同的二叉搜索树
✅做题思路or感想
这道题是我二刷代码随想录一路无双下来第一个遇到的一点思路也没有的题目,惭愧
dp数组的含义
dp[i]是指总节点数为n的不同二叉搜索树的种类
递推公式
- 在对
dp[i]的遍历中,总节点数为n,取其中的j为一个根节点,则这个节点的左边有j - 1个节点,右边有i - j个节点,故dp[j] = dp[j - 1] * dp[i - j]。而j仅仅是[1, i]中的一个节点给dp[i]带来的二叉搜索树的种类数,还要把其余的节点的种类数都加起来才是dp[i] - 综上,有
dp[i] += dp[j - 1] * dp[i - j]
初始化
- 这里的初始化很奇妙,为了能让后面的数成立且有效,所以
dp[0] = 1,而dp[0]本身是没有什么意义的,仅仅是因为这样能推出后面的答案而已(难点)
遍历顺序
- 因为从递推公式知道,后来的值是由前面的值推出,故从小到大
class Solution {
public:
int numTrees(int n) {
int dp[21] = {0};
//初始化
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];
}
};

浙公网安备 33010602011771号