图论-最大、小高度树

图论-最大、小高度树

问题

Leetcode 310

分析

用树的直径证明BFS

答案要么是一个节点,要么是两个节点

首先我们证明一下答案要么是一个节点,要么是两个节点。

我们先给出树的直径的定义:

图中所有最短路径的最大值即为「直径」,可以用两次 DFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。

我们把一个树的直径拉成一条直线:

树的直径.PNG

图中橙色节点为树直径上的节点,蓝色节点代表其他与图连通的其他节点。

我们给出以下断言:

最小高度树的节点只能是树直径上的节点,而且必须是直径的中点。

我们设树的直径的中点到端点的距离为 R R R,任意一个O节点到树直径中点M的距离为 O M OM OM,此时如果把节点O当做是最小高度树的根节点,那么这颗树的高度为 H = O M + R H=OM+R H=OM+R,即O先到中点M的距离,然后再到一个远端Sk的距离,也就是半径 R R R

中点.PNG

当节点O为中点M的时候 O M = 0 OM=0 OM=0,此时 H = O M + R = R H=OM+R=R H=OM+R=R,此时的高度 H H H是最小的。当直径中的节点个数是奇数的时候,中点只有一个;当为偶数个的时候,中点有两个。

BFS

我们的BFS策略是,依次消除出度为1的端点,直到剩下一个或者两个端点为止。

其实我们做的工作,从本质上讲,每一次的消除都消除了直径的两个端点。没错,跟拓扑排序的思路是一样的,但是,与其说是拓扑排序,不如说是消除端点。

过程.PNG

如图,我们最终我们只剩下了中点M,即问题的解。

最后,我们知道,最小高度树的高度就是半径,那么相对的,最大高度树的树高也就是直径了,以任意两个直径的端点作为根节点即可。

以上。

Have a good time 😃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值