遍历图最常用的有两种方式,就是你常听到的 BFS 和 DFS.
- BFS: Breadth First Search,广度优先搜索
- DFS: Depdth First Search,深度优先搜索
BFS
BFS 类似于树的层序遍历,从第一个节点开始,先访问离 A 最近的点,接着访问次近的点。我们先来构造一个图:
from collections import dequeclass Queue(object):def __init__(self):self._deque = deque()def push(self, value):return self._deque.append(value)def pop(self):return self._deque.popleft()def __len__(self):return len(self._deque)def bfs(graph, start):search_queue = Queue()search_queue.push(start)searched = set()while search_queue: # 队列不为空就继续cur_node = search_queue.pop()if cur_node not in searched:yield cur_nodesearched.add(cur_node)for node in graph[cur_node]:search_queue.push(node)if __name__ == '__main__':GRAPH = {'A': ['B', 'F'],'B': ['C', 'I', 'G'],'C': ['B', 'I', 'D'],'D': ['C', 'I', 'G', 'H', 'E'],'E': ['D', 'H', 'F'],'F': ['A', 'G', 'E'],'G': ['B', 'F', 'H', 'D'],'H': ['G', 'D', 'E'],'I': ['B', 'C', 'D'],}print('bfs:')bfs(GRAPH, 'A')"""bfs:ABFCIGEDH"""
DFS
深度优先搜索(DFS)是每遇到一个节点,如果没有被访问过,就直接去访问它的邻居节点,不断加深。代码其实很简单:
DFS_SEARCHED = set()def dfs(graph, start):if start not in DFS_SEARCHED:print(start)DFS_SEARCHED.add(start)for node in graph[start]:if node not in DFS_SEARCHED:dfs(graph, node)print('dfs:')dfs(GRAPH, 'A') # A B C I D G F E H
