- 首先明确dp数组及其下标的含义 dp[i] 是由i个节点组成且节点值从1到i互不相同的二叉树的种类数
- 明确递推公式:对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加一共i个节点,对于根节点 j 时,左子树的节点个数为 j - 1,右子树的节点个数为 i - j
- 初始化数组 :只需要初始化 0个节点 和 1个节点的情况
- 确定遍历的顺序:从前向后
- 举例推导dp数组
参考来源:代码随想录
class Solution {
public int numTrees(int n) {
//首先明确dp数组下边及其含义:dp[i] 是由i个节点组成且节点值从1到i互不相同的二叉树的种类数
int[] dp = new int[n + 1];
//初始化dp数组 初始化0个节点和1个节点的情况
dp[0] = 1;
dp[1] = 1;
//确定遍历顺序 从前向后
for(int i = 2; i <= n; i++){
for(int j = 1; j <= i; j++){
//对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加
//一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
}