美文网首页
310. Minimum Height Trees

310. Minimum Height Trees

作者: codingXue | 来源:发表于2016-05-23 15:00 被阅读212次

问题描述

For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write a function to find all the MHTs and return a list of their root labels.
Format
The graph contains n nodes which are labeled from 0 to n - 1. You will be given the number n and a list of undirected edges (each edge is a pair of labels).
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
Example 1:
Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]
return [1]
Example 2:
Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
return [3, 4]
Hint:
How many MHTs can a graph have at most?
Note:
(1) According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
(2) The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.

问题分析

参考了LeetCode的Disccuss
Hint: 答案只可能有一个或两个节点。思路为依次删除叶子节点,剩下的1/2个节点即为解。
速度问题:如果每次遍历选出叶子节点,速度比较慢,可以每次删除当前叶子节点时,将新的叶子节点记录下来。

AC代码

class Solution(object):
    def findMinHeightTrees(self, n, edges):
        """
        :type n: int
        :type edges: List[List[int]]
        :rtype: List[int]
        """
        if n == 1:
            return [0]
        neighbor = [set() for i in range(n)]
        for p,q in edges:
            neighbor[p].add(q)
            neighbor[q].add(p)
        
        leaves = [x for x in range(n) if len(neighbor[x]) == 1]

        while n > 2:
            n -= len(leaves)
            newLeaves = []
            for p in leaves:
                q = neighbor[p].pop()
                neighbor[q].remove(p)
                if len(neighbor[q]) == 1:
                    newLeaves.append(q)
            leaves = newLeaves
        return leaves

Runtime: 116 ms which beats 82.55% of Python submissions.

相关文章

网友评论

      本文标题:310. Minimum Height Trees

      本文链接:https://www.haomeiwen.com/subject/rhmarttx.html