宽搜/广搜简称BFS,Dijkstra单源最短路径算法和Prim最小生成树算法均使用广搜的思想,从一点出发向外辐射直至遍历所有结点。广搜主要用于解决最短路径、层序遍历和大范围查找问题。本文主要总结在图和树(特殊的图)上的广搜。
示例1:
图的广度优先搜索(图源为AI AX AT)
代码:
import os
import sys
graph = {
1: {2, 3},
2: {1, 4, 5},
3: {1, 6, 7},
4: {2, 8},
5: {2, 8},
6: {3, 8, 9},
7: {3, 9},
8: {4, 5, 6},
9: {6, 7}
}
def bfs(graph, s):
queue = [s]
parent = {s: None}
flag = set()
flag.add(s)
while queue:
temp = queue.pop()
nodes = graph[temp]
for vertex in nodes:
if vertex not in flag:
queue.append(vertex)
flag.add(vertex)
parent[vertex] = temp
return parent
parent = bfs(graph, 1)
v = 8
while v:
print(v, end=' ')
v = parent[v]
解释:
1)此处手动输入了示例1,若实际图过大或复杂可以设置相应类
2)parent字典用于记录某结点的父结点,方便路径回溯;flag为一个集合,用于标记已经遍历过的结点(该图为无向图);s为起始结点,v为终止结点。
示例2:
图的广度优先搜索(图源为AI AX AT)
代码:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def levelOrder(root):
queue = [root]
next_queue = []
result = []
if root is None:
return []
while queue:
for root in queue:
result.append(root.val)
if root.left:
next_queue.append(root.left)
if root.right:
next_queue.append(root.right)
queue = next_queue
next_queue = []
return result
if __name__ == "__main__":
tree = TreeNode(4)
tree.left = TreeNode(9)
tree.right = TreeNode(0)
tree.left.left = TreeNode(5)
tree.left.right = TreeNode(1)
tree.right.left = TreeNode(3)
tree.right.right = TreeNode(2)
tree.left.left.left = TreeNode(10)
tree.right.left.right = TreeNode(7)
print(levelOrder(tree))
解释:
1)树的广度优先搜索本质上即为树的层次遍历
树的层次遍历详见(特别注意输出方式即可):
LeetCode in Python 102. Binary Tree Level Order Traversal (二叉树的层序遍历)-CSDN博客