178. 圖是否是樹
阿新 • • 發佈:2020-08-08
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