本文介绍树的重心的概念和基本性质。

定义

如果在树 中删去某个结点 后,得到的图 中每个连通分量的大小均不超过原树结点数的一半,就称这个结点 为整棵树的 重心(centroid)。删去某一结点后得到的最大连通分量的大小也称为该结点的 重量(weight)。利用这一概念,重心的定义可以叙述为重量不超过树结点数的一半的结点。

「子树」

本文可能同时涉及无根树、有根树,以及将有根树换根到非根结点得到的树。为了避免混淆,本文将用 表示无根树,用 表示以结点 为根的有根树。本文中提到的「子树」均是指 有根树 中,一个结点及其所有子孙结点构成的树。有根树 中,结点 对应子树记为 。这样定义的子树当然包括整棵树本身。如果要明确不包括整棵树本身,将称呼它为「真子树」。

无根树中的「子树」通常指它的一个连通子图。在讨论重心时,部分作者会用「子树」一词特指不包含某结点的极大连通子图,或者特指将某条边删去后得到的两个连通分量之一。容易验证,这两种方式定义得到的「子树」集合是一致的,且不包括整棵树自身。由于它和有根树的子树集合并不一致,本文将避免对无根树使用「子树」概念。

在实际求解重心或处理某些问题时,通常存在一个默认的树根。此时,将非根结点 删掉得到的连通分量中,除了该结点的子结点对应子树外,还有一棵「向上」的子树。此时,设结点 的父结点为 ,这棵「向上」的子树就是 。本文在提及这类子图时,会显式地称呼它为「向上」的子树。若无特殊说明,本文提及的子树均不包括这类「向上」的子树。

注意到,得到的这些连通分量同样是无根树。通过删去树的重心,一棵树将变为若干棵至多原树一半大小的树。重心的这一特性使得在树上应用分治思想解决问题成为可能。这就是 点分治,也称为树的重心分解。

性质

本节讨论重心的性质。首先,树的重心有如下等价定义:

等价定义

中的结点 是它的重心,当且仅当以下任意一条成立:

[list2tab]

  • 无根树版本
    1. 在树中删去结点 后,得到的图 中每个连通分量的大小均不超过原树结点数的一半。
    2. 在所有删去某个结点后得到的最大连通分量大小中,删去结点 时所得到的值最小。
    3. 树中所有结点到某个结点的距离和中,到结点 的距离和最小。
  • 有根树版本
    1. 当树以结点 为根时,任一真子树的大小均不超过原树结点数的一半。
    2. 在所有以某个结点为根时的最大真子树大小中,以结点 为根时所得到的值最小。
    3. 在所有以某个结点为根时所有结点的深度和中,以结点 为根时深度和最小。

[!note]- 证明

首先,引入一些记号。有根树和无根树两个版本的表述显然是等价的。定义 ,其中, 表示 相邻。定义 ,其中, 表示结点 之间的距离。那么,定义 1 相当于要求 ,定义 2 相当于要求 ,定义 3 相当于要求 。需要证明的是,这三个条件是等价的。

理解为以 为根时的结点深度和,考虑它在树根从结点 换为相邻结点 时发生的变化。注意到,在树中删去边 后,得到的两个连通分量分别是子树 。在换根前后,子树 中每个结点深度都增加 ,子树 中每个结点深度都减少 ,所以,深度和的变化为

所以,定义 1 的条件相当于要求 的所有相邻结点 都成立,也就是说, 的极小值点。

转而设 的(一个)最小值点(即定义 3),它必然存在,且一定是极小值点。考虑以 为根的有根树 。设 是一个非根结点,且从 的有向路径上,结点 的后一个结点为 (可能就是 ),结点 的前一个结点为 (可能就是 )。那么,因为 ,所以有

其中,最后一步用到 的极小值点这一事实。此时,有两种情形:

  • 存在结点 使得 成立。此时,根据上述不等式,必然有 ,且 。也就是说,使得等式成立的结点 只能有一个,且它必然与 相邻。此时,对于所有其他结点 ,必然存在 使得 成立。满足条件 1 的结点集合为

    注意到,删去任何结点时,得到的连通分量大小之和总是 ,所以,只要有一个连通分量大小不小于 ,它就必然是最大连通分量。因此,对于这种情形,,且对于所有 都有 。因此,满足条件 2 的结点集合为

    又因为 ,所以 。因为 是最小值点, 也一定是最小值点。而对于 都存在 使得 ,这违反了极小值点需要满足的条件,所以, 一定也不是最小值点。因此,满足条件 3 的结点集合为

  • 不存在结点 使得 成立。此时,对于所有结点 ,都存在结点 使得 。重复前文分析可知,对于所有结点 ,都有 ,且 不是 的极小值点。因此,满足条件 1 的结点只有 ,且

无论在哪一情形中,满足三个条件的集合都是相同的。这就证明了三个定义是等价的。

除了这些等价定义外,树的重心还有如下常见性质:

性质

  1. 树的重心如果不唯一,则恰有两个。这两个重心相邻。而且,删去它们的连边后,树将变为两个大小相同的连通分量。
  2. 在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
  3. 把两棵树通过一条边相连得到一棵新的树,那么新树的重心在连接原来两棵树的重心的路径上。
  4. 一棵有根树的重心一定在根结点所在的重链上。一棵树的重心一定是该树根结点重子结点对应子树的重心的祖先。

求法

根据重心的等价定义,有两种方法可以在 时间内求出树的所有重心,其中, 为树的大小。

DFS 统计子树大小

通过 DFS 计算每个子树的大小。对每个结点,记录它的所有子结点对应子树的大小,并利用总结点数减去当前子树大小得到「向上」的子树的大小,然后就可以依据定义找到重心了。

换根 DP 统计深度和

还可以通过换根 DP 计算出以不同结点为根时,所有结点的深度和(即到当前根结点的距离和)。根据定义,只需要找到使得这一深度和最小的结点即可。

例题

给定一棵有根树,求出每一棵子树的重心。

习题

参考资料