class graph: def __init__(self,value): self.value=value self.neighbors=None # 圖的廣度優先遍歷 # 1.利用隊列實現 # 2.從源節點開始依次按照寬度進隊列,然后彈出 # 3.每彈出一個節點,就把該節點所有沒有進過隊列的鄰接點放入隊列 # 4.直到隊列變空 from queue import Queue def bfs(node): if node is None: return queue = Queue() nodeSet = set() queue.put(node) nodeSet.add(node) while not queue.empty(): cur = queue.get() # 彈出元素 print(cur.value) # 打印元素值 for next in cur.neighbors: # 遍歷元素的鄰接節點 if next not in nodeSet: # 若鄰接節點沒有入過隊,加入隊列並登記 nodeSet.add(next) queue.put(next) # 圖的深度優先遍歷(非遞歸) # 1.利用棧實現 # 2.從源節點開始把節點按照深度放入棧,然后彈出 # 3.每彈出一個點,把該節點下一個沒有進過棧的鄰接點放入棧 # 4.直到棧變空 def dfs(node): if node is None: return nodeSet = set() stack = [] print(node.value) nodeSet.add(node) stack.append(node) while len(stack) > 0: cur = stack.pop() # 彈出最近入棧的節點 for next in cur.neighbors: # 遍歷該節點的鄰接節點 if next not in nodeSet: # 如果鄰接節點不重復 stack.append(cur) # 把節點壓入 stack.append(next) # 把鄰接節點壓入 nodeSet.add(next) # 登記節點 print(next.value) # 打印節點值 break # 退出,保持深度優先 def dfs1(node,nodeset):#遞歸深度優先遍歷 if node is None: return print(node.value) nodeset.add(node) for next in node.neighbors: if next not in nodeset: dfs1(next, nodeset) node5=graph(5) node4=graph(4) node3=graph(3) node2=graph(2) node1=graph(1) nodeset=set() node4.neighbors=[node3,node2,node1] node3.neighbors=[node4] node2.neighbors=[node4,node5] node1.neighbors=[node4] node5.neighbors=[node2] dfs1(node4,nodeset) dfs(node4) bfs(node4)