美文网首页
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