跳到主要内容

树形动态规划

本节目标

在后序汇总子树信息,并把根的答案传给子树。

识别信号

决策附着在节点或边上,子树之间只通过父子关系连接。递归遍历基础见子树信息递归

状态定义与转移推导

状态必须说明“当前节点是否选取、是否被覆盖”或“当前根外部信息是什么”。子节点状态合并后才得到父节点状态。

初始化与遍历顺序

后序处理先得到子树答案;换根题先以根建立父序,再逆序汇总规模,最后正序下传答案。

通用模板

dfs(node, parent):
for child: dfs(child, node)
merge child states into node state

空间优化与复杂度

每条边通常只访问常数次,因此时间 O(n)、辅助空间为递归栈或父序数组 O(n)

母题序列

  1. 打家劫舍 III必学):选与不选的二元状态。
  2. 监控二叉树拓展):未覆盖、装相机、已覆盖三态。
  3. 树中距离之和拓展):两遍换根。

常见误区

把跨调用的答案存为未重置成员变量,或在换根时漏掉 n - 2 * size[child] 的双向变化。

迁移方向

树被拆成独立子树时使用本框架;图存在环时要额外处理访问和环,不能直接套树递归。