310. 最小高度树
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。

格式

该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。

你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。

示例 1:

输入: n = 4, edges = [[1, 0], [1, 2], [1, 3]]

        0
        |
        1
       / \
      2   3 

输出: [1]
只要找到最长的那条路径,返回最中间位置的节点即可。

我们将路径记录到graph这个dict中

然后从所有叶子节点开始BFS,
从节点i到达下一个节点j时,
    我们直接从graph[j]中将前一个节点i移除,
    然后判断j的剩余连接数,如果大于1,
        则表明我们当前所在树枝不是节点j连接的最长树枝,
        因为越短的枝,越早到达交汇处
        我们终止遍历,将此树枝舍弃掉
    如果连接数为1,
        则表明我们当前所在的树枝,有可能是最长的那个
        将j添加到下一轮的遍历中
最后,我们找不到下一轮的节点了
至此我们已经树上的所有节点遍历完成
返回这轮的所有节点即可

作者:vzp
链接:https://leetcode-cn.com/problems/minimum-height-trees/solution/python3-bfs-ti-jie-by-vzp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Code
class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        graph = collections.defaultdict(set)
        for p, q in edges:
            graph[p].add(q)
            graph[q].add(p)

        nodes = []
        for i in range(n):
            if len(graph[i]) < 2:
                nodes.append(i)

        while True:
            temp = []
            for i in nodes:
                for j in graph[i]:
                    graph[j].remove(i)
                    if len(graph[j]) == 1:
                        temp.append(j)
            if not temp:
                return nodes
            nodes = temp
View Code

 

posted on 2020-08-05 22:25  topass123  阅读(288)  评论(0编辑  收藏  举报