BFS 算法框架
从整体到细节,自顶向下,从抽象到具体的框架思维是通用的,不只是学习数据结构和算法,学习其他任何知识都是高效的。
# BFS 解决的问题
BFS 原本是图的一种遍历方式,从一个点开始,向四周开始扩散。一般都是用队列辅助遍历过程,每次将一个节点周围的所有节点加入队列。 因此广泛用于给定起始点(的条件)寻找最短距离。
BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度比 DFS 大很多。
# BFS 算法框架
下面是用 C++ 写的一个框架,基本思想来源于 labuladong。
// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node end)
{
deque<Node> q; // 核心数据结构
set<Node> vistied; // 避免走回头路
q.push_back(start);
visited.insert(start);
while(!q.empty())
{
int sz = q.size(); // 当前层的节点个数
// 当前队列中所有节点向四周扩散
for(int i = 0; i < sz; ++ i)
{
Node cur = q.front();
q.pop_front();
// 划重点:这里判断是否到达 target
if(cur is target)
return step;
// 将 cur 的相邻节点加入队列
for(Node x: cur.adj())
if(x not in visited)
{
q.push_back(x);
visited.insert(x);
}
}
}
// 划重点:在这里更新步数
++ step;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 应用例子
求二叉树的最小深度,打印二叉树以及打开转盘锁都可以用 BFS 框架来解决。