178. 图是否是树

178. 图是否是树

中文English

给出 n 个节点,标号分别从 0 到n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树

样例

样例 1:

输入: n = 5 edges = [[0, 1], [0, 2], [0, 3], [1, 4]]
输出: true.

样例 2:

输入: n = 5 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]]
输出: false.

注意事项

你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。

 
 
输入测试数据 (每行一个参数)如何理解测试数据?

 BFS写法

图和树的区别:

图存在n个点,m条边

树的话,存在上下级关系,n个点,n-1条边

class Solution:
    """
    @param n: An integer
    @param edges: a list of undirected edges
    @return: true if it's a valid tree, or false
    """
    def validTree(self, n, edges):
        # write your code here
        #如何判断,是否是树,如果是树的话,n个点,存在n-1条边
        #图的话,n个点,m条边
        
        #判断当前该edges边是否是树的话,可以判断边长个数
        #如果边长直接是不等于n-1,返回False
        if (len(edges) != n - 1): return False 
        
        #否则,判断visted的个数
        visted = {}
        queue = [0]
        array = collections.defaultdict(list)
        
        for edge in edges:
            array[edge[0]].append(edge[1])
            array[edge[1]].append(edge[0])
        
        
        while queue:
            pop_node = queue.pop(0)
            visted[pop_node] = True 
            
            #取出当前节点的所有邻接点,从0开始出发往下找所有的邻接点,当出现断层,说明不是树,visted自然会减少
            for edge in array[pop_node]:
                if edge not in visted:
                    visted[edge] = True
                    queue.append(edge)
        
        print(visted)
        return len(visted) == n 
        

 

posted @ 2020-08-08 15:47  风不再来  阅读(169)  评论(0编辑  收藏  举报