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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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