广度优先搜索(BFS,BreadthFirstSearch)的一个常见应用是找出从根结点到目标结点的最短路径,其实现用到了队列。下面用一个例子来说明BFS的原理,在下图中,我们BFS来找出根结点A和目标结点G之间的最短路径。
图3:BFS例子
首先初始化一个队列Q,将根节点入队:A
A出队,将与A相邻的节点入队,此时队列为BCD
B出队,将与B相邻的节点入队,此时队列为CDE
C出队,将与C相邻的节点入队,此时队列为DEF(节点E已经被遍历过,不需要再入队)
D出队,将与D相邻的节点入队,此时队列为EFG
E出队,下面没有节点
F出队,下面是G,已遍历过,为目标值,遍历结束
BFS代码模板:
defBFS(graph,start,end): queue=[] queue.append([start]) visited.add(start) #对于图来说,要标记节点已经被访问过,防止重复访问 whilequeue: node=queue.pop() #出队 visited.add(node) #标记访问 process(node) #对节点进行一些处理 nodes=generate_related_nodes(node) #得到当前节点的后继节点,并且没有被访问过 queue.push(nodes) #其他处理部分 ...二、深度优先搜索
与BFS类似,深度优先搜索(DFS,Depth-First-Search)也可用于查找从根结点到目标结点的路径。下面通过一个例子,用DFS找出从根结点A到目标结点G的路径。
图3:BFS例子
在上面的例子中,我们从根结点A开始。首先,我们选择结点B的路径,并进行回溯,直到我们到达结点E,我们无法更进一步深入。然后我们回溯到A并选择第二条路径到结点C。从C开始,我们尝试第一条路径到E但是E已被访问过。所以我们回到C并尝试从另一条路径到F。最后,我们找到了G。虽然我们成功找出了路径A-C-F-G,但这不是从A到G的最短路径。
DFS代码模板:
#递归写法visited=set()defDFS(node,visited): visited.add(node) #processcurrentnodehere ... fornext_nodeinnode.children(): ifnext_nodenotinvisited: DFS(next_node,visited)三、例题(1)岛屿数量问题
此题为leetcode的第题(