1. 程式人生 > 實用技巧 >178. 圖是否是樹

178. 圖是否是樹

178.圖是否是樹

中文English

給出n個節點,標號分別從0n - 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