xxx 最小高度树(Minimum Height Trees)问题
字数 841 2025-11-15 07:54:51
xxx 最小高度树(Minimum Height Trees)问题
问题描述
给定一个具有 n 个节点的树(即无环连通无向图),以及一个从 0 到 n-1 的节点编号列表。树可以以任意节点为根形成有根树,此时从根到叶子的最长路径长度称为树的高度。最小高度树(MHT)是指所有可能的根节点中,树高度最小的那些根节点。要求找出所有这样的根节点。
关键观察
- 树的中心性:最小高度树的根节点实际是树的“中心”,即图中最长路径(直径)的中点。
- 拓扑排序思路:通过逐层剥离叶子节点(度为1的节点),最终剩下的1个或2个节点即为解。
- 性质:树中最小高度树根节点最多有2个。若直径长度为偶数,有1个中心;若为奇数,有2个中心。
解题步骤
-
边界处理
- 若 n=1,直接返回 [0];若 n=2,返回 [0,1]。
-
构建邻接表与度数组
- 使用邻接表存储树结构,同时记录每个节点的度(相邻节点数)。
-
初始化叶子队列
- 将所有度为1的节点(叶子)加入队列。
-
层层剥离叶子
- 当剩余节点数 > 2 时:
a. 记录当前叶子层的节点数。
b. 遍历当前所有叶子节点,将其从图中移除(度减为0)。
c. 更新这些叶子的邻居节点的度。若邻居度降为1,加入下一轮叶子队列。
d. 剩余节点数减去本层剥离的叶子数。
- 当剩余节点数 > 2 时:
-
返回剩余节点
- 队列中剩余的1个或2个节点即为所有最小高度树的根节点。
示例说明
以 n=6, 边列表 [[0,1],[0,2],[0,3],[3,4],[3,5]] 为例:
- 初始叶子:节点1、2、4、5(度=1)。
- 第一轮:移除1、2、4、5,此时节点0度由4减为1,节点3度由3减为1。
- 第二轮:移除节点0和3,剩余节点数为0,提前结束。最终返回 [0,3]?实际上应修正逻辑:当剩余节点≤2时终止,因此首轮移除后剩余节点0和3即为解。
算法特点
- 时间复杂度:O(n),每个节点处理一次。
- 空间复杂度:O(n),存储邻接表和队列。
- 核心思想:不断删除外层叶子,逐渐逼近中心节点。