310. 最小高度树

exiaohu 于 2022-04-06 发布

题目链接:310. 最小高度树

寻找最小高度的点,就是寻找图中最中心的点。

最小高度的根结点可能有 $1$ 个或者 $2$ 个,这样的点,即图中最中心的结点。

每次去掉图的叶子结点,即其最边缘的结点,最后剩下 $1$ 个或者 $2$ 个结点时,就是最小高度的点。

from collections import defaultdict
from typing import List


class Solution:
    def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
        g, nodes = defaultdict(list), set(range(n))
        for l, r in edges:
            g[l].append(r)
            g[r].append(l)
            nodes.add(l)
            nodes.add(r)

        while len(nodes) > 2:
            rv = []
            for l in nodes:
                if len(g[l]) == 1:
                    rv.append(l)
            nodes.difference_update(rv)
            for l in rv:
                r = g[l].pop()
                g[r].remove(l)

        return list(nodes)