解法
方法是从叶子开始删除点,一直删到最后只剩下一个或两个点为止。
为什么是1个或2个呢?首先,1个就不用解释了,当剩下2个点的时候,它们都是叶子节点,再删就空了,所以它们两个都可以作为根,得到的最小树高是一样的。当删剩下2个以上节点的时候,由于剩下的图也一定是个无向树图,所以一定能删得剩下1个或2个节点。
class Solution(object):
def findMinHeightTrees(self, n, edges):
"""
:type n: int
:type edges: List[List[int]]
:rtype: List[int]
"""
if n==0:
return []
from collections import defaultdict
edge = defaultdict(list)
for x,y in edges:
edge[x].append(y)
edge[y].append(x)
nodes = set(xrange(n))
leaves = set()
for i in xrange(n):
if len(edge[i])==1:
leaves.add(i)
while len(nodes)>2:
nodes -= leaves
new_leaves = set()
for x in leaves:
edge[edge[x][0]].remove(x)
if len(edge[edge[x][0]])==1:
new_leaves.add(edge[x][0])
leaves = new_leaves
return list(nodes)