310. Minimum Height Trees

解法

方法是从叶子开始删除点,一直删到最后只剩下一个或两个点为止。

为什么是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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值