这道题的思路是每次都从图中将叶子节点去掉,直到最后只剩下1个或者2个节点时,这样的节点为根节点。
需要用set(字典)数据结构存储每个节点的邻居。查找叶子节点时,即查找len(set) = 1的节点。去掉叶子节点时,需要将它们相邻节点中set存储的叶节点邻居也去掉。
# 代码来自leetcode https://leetcode.com/problems/minimum-height-trees/discuss/76055/Share-some-thoughts
class Solution(object):
def findMinHeightTrees(self, n, edges):
if n == 1:
return [0]
adj = [set() for _ in range(n)]
for i, j in edges:
adj[i].add(j)
adj[j].add(i)
leaves = [i for i in range(n) if len(adj[i]) == 1]
while n > 2:
n -= len(leaves)
newLeaves = []
for i in leaves:
j = adj[i].pop()
adj[j].remove(i)
if len(adj[j]) == 1: newLeaves.append(j)
leaves = newLeaves
return leaves