310. Minimum Height Trees

https://leetcode.com/problems/minimum-height-trees/

solution

  • 问题转化为:找出距离其他所有节点(特别是叶节点)最近的节点,在树状图中寻找所有质心节点

  • 利用拓扑排序:从较少degree的节点往上游

class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        graph = collections.defaultdict(list)
        for x, y in edges:
            graph[x].append(y)
            graph[y].append(x)

        leaves = [x for x in range(n) if len(graph[x]) <= 1]

        while len(graph) > 2:
            new_leaves = []
            for leaf in leaves:
                neighbor = graph[leaf].pop()
                del graph[leaf]
                graph[neighbor].remove(leaf)
                if len(graph[neighbor]) == 1:
                    new_leaves.append(neighbor)
            leaves = new_leaves
        return leaves

时间复杂度:O() 空间复杂度:O()

  • 超时BFS

Last updated