题目链接: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)