你在一家连锁企业做物流规划。公司有 10 万个门店,它们之间的关系是一张「上下级配送网」——每个门店只从它唯一的上级门店收货,上级再往上级拿货。整张网是一棵树。
任务一:公司要新建一个 中心仓库,要求「所有门店到仓库的总运输路程最短」。你该怎么选址?
任务二:公司要安排一条 巡检路线,从某个门店出发,沿配送网走到另一个门店,要求走的路程最长(要覆盖最远的两个店)。你该怎么找?
任务三:老板还要求:任意一个门店的下属门店(即它的整棵子树)里,共有多少件库存?这个统计要支持随时修改某个门店的库存,并支持随时查询。传统的遍历会超时,怎么办?
三个任务,对应树上的三个核心概念。
• 任务一的答案是树的重心——以它为根时,最大的子树最小,所有点到它的距离和也最小;
• 任务二的答案是树的直径——树上最远两点之间的路径;
• 任务三要借助 DFS 序:DFS 进入/离开的时间戳能把「一棵子树」变成数组上一段连续的区间,于是子树操作就变成了区间操作,可以直接上树状数组或线段树。
重心管「居中」、直径管「最远」、DFS 序管「结构化」、欧拉序管「路径查询」。
💡 为什么这四个概念是同一套思想?
共同点:它们都在回答「如何给一棵树建立坐标」。树没有环、没有横向连接,所有信息都藏在父子关系里。
重心用「最大子树」衡量平衡;直径用「最长的两点链」衡量尺度;DFS 序把树「拍平」成序列;欧拉序把路径问题转成区间最值问题。
工程意义:一旦理解了「子树 = 连续区间」,树的很多问题就能降维成一维问题——这是提高组从「会写树」到「会用树」的关键一步。