Leetcode 310. Minimum Height Trees(python+cpp)

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值