一、什么是树形 DP
树形 DP 是在树结构上进行动态规划。状态定义在节点上,转移通过子节点 → 父节点(后序遍历)完成。
核心模式:
- 状态:
dp[u]表示以节点 u 为根的子树的某个最优值 - 转移:遍历 u 的所有子节点 v,用
dp[v]更新dp[u] - 遍历顺序:后序(先处理子树,再处理当前节点)
Mermaid · 渲染中(下方为源码)
graph TD R[根] --> A[子树 A] R --> B[子树 B] A --> C[叶] A --> D[叶] B --> E[叶]
先算 C、D → 算 A → 算 E → 算 B → 最后算根。
二、通用模板
void treeDP(TreeNode node) {
if (node == null) return;
// 后序:先递归子节点
treeDP(node.left);
treeDP(node.right);
// 用子节点的结果更新当前节点
dp[node] = f(dp[node.left], dp[node.right]);
}三、经典案例
3.1 二叉树的最大深度
最基础的树形 DP:
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}