Leetcode 310. Minimum Height Trees
题目
解析:拓扑排序+BFS
这道题目很巧妙,需要灵活运动对于图的理解。题目原本的说法是要找到某个节点,使得以其为根节点所组成的多叉树的高度最小,那么换个方式来理解,就是要找到图中最中心的节点,以最中心的节点为根节点组成的图一定就是高度最矮的。
那么如何找最中心的节点呢?这边其实思想跟934 shortest bridge的思想有点像,那倒题目是通过以一个岛为中心,利用BFS一层层向外扩散来解决的。而这边则可以反过来,从外侧一层层向里进行收缩来完成,而由于这边是个无向图,所以我们需要利用到拓扑排序的思想,具体如下:
- 首先利用字典构建节点间的邻接关系
- 将所有初始的时候入度为1的节点作为BFS的起点,这些入度为1的节点说明位于图的最外圈
- 进行BFS,每次需要移除当前图中所有入度为1的节点,并将新生成的入度为1的节点放入队列待后续操作
- 最关键的一步在于结束条件的判断,由于题中说明提供的图是具有树的特性的,那么一定不会存在环,所以当队列中只剩下1个或者2个结点的时候,队列中的节点便一定是中心节点
python代码如下:
class Solution:
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
if n==1: return [0]
graph = collections.defaultdict(list)
for u,v in edges:
graph[u].append(v)
graph[v]