310. Minimum Height Trees
思路: 最短的MHT的root是最長的路徑的中間節點。所以最多隻會有2個root。計算所有點的入度,每次去掉入度爲1的節點。對應的鄰居就要入度-1.再次重複步驟去掉入度爲1的節點,直到剩下小於2個點。
class Solution(object):
def findMinHeightTrees(self, n, edges):
if n == 1: return [0]
neighbors = collections.defaultdict(list)
degress = collections.defaultdict(int)
for u,v in edges:
neighbors[u].append(v)
neighbors[v].append(u)
degress[u] += 1
degress[v] += 1
level = []
for i in xrange(n): # 找到入度爲1的
if degress[i] == 1:
level.append(i)
unvisited = set(range(n))
while len(unvisited) > 2: # 這裏是unvisited >2 不是len(level)
nextLevel = []
for u in level:
unvisited.remove(u)
for neighbor in neighbors[u]:
if neighbor in unvisited:
degress[neighbor] -= 1
if degress[neighbor] == 1:
nextLevel.append(neighbor)
level = nextLevel
return level