1.廣度優先搜索
1 # 圖的廣度優先遍歷 2 # 1.利用隊列實現 3 # 2.從源節點開始依次按照寬度進隊列,然后彈出 4 # 3.每彈出一個節點,就把該節點所有沒有進過隊列的鄰接點放入隊列 5 # 4.直到隊列變空 6 from queue import Queue 7 def bfs(node): 8 if node is None: 9 return 10 queue = Queue() 11 nodeSet = set() 12 queue.put(node) 13 nodeSet.add(node) 14 while not queue.empty(): 15 cur = queue.get() # 彈出元素 16 print(cur.value) # 打印元素值 17 for next in cur.nexts: # 遍歷元素的鄰接節點 18 if next not in nodeSet: # 若鄰接節點沒有入過隊,加入隊列並登記 19 nodeSet.add(next) 20 queue.put(next)
2.深度優先搜索
1 # 圖的深度優先遍歷 2 # 1.利用棧實現 3 # 2.從源節點開始把節點按照深度放入棧,然后彈出 4 # 3.每彈出一個點,把該節點下一個沒有進過棧的鄰接點放入棧 5 # 4.直到棧變空 6 def dfs(node): 7 if node is None: 8 return 9 nodeSet = set() 10 stack = [] 11 print(node.value) 12 nodeSet.add(node) 13 stack.append(node) 14 while len(stack) > 0: 15 cur = stack.pop() # 彈出最近入棧的節點 16 for next in cur.nexts: # 遍歷該節點的鄰接節點 17 if next not in nodeSet: # 如果鄰接節點不重復 18 stack.append(cur) # 把節點壓入 19 stack.append(next) # 把鄰接節點壓入 20 set.add(next) # 登記節點 21 print(next.value) # 打印節點值 22 break # 退出,保持深度優先
