BFS 算法框架

111. 二叉树的最小深度

752. 打开转盘锁

 

前文讲了 回溯(DFS) 算法框架,算法核心可以大概总结为:不到南墙不回头

如果说 DFS 是树的递归遍历,那么 BFS 对应的就是树的层序遍历,一层一层的往下遍历

层序遍历

如下图所示,树的层次遍历就是一层一层的往下遍历

4

具体代码如下所示:

11 注:层次遍历是可以携带层级数据,即可以知道每次处理的是第几层

利用上面的特点我们可以求一些最值问题,如:二叉树的最小深度

 

9

打开转盘锁

这个题目,我们可以抽象成一棵树,如下图所示:

5

对于每一组 4 位数字,都有 8 种变换

因为存在可能重复的 4 位数字,所以我们需要记录每组数字的访问情况

由于题目有一个「死亡数字」,所以我们遇到「死亡数字」,需要跳过

综上:我们可以很容易知道剪枝的情况,即:

我们先来实现一些小功能:得到某一位数字加减 1 后的数字

我们现在可以根据思路写出如下代码:

打开转盘锁优化

在讲优化之前,我们先看看上面代码的执行过程:

6

可以明显看到,未优化的版本从start开始一层一层的向下遍历,直到遇到target节点停止

优化思路:双向 BFS (双向奔赴 哈哈哈哈哈)

执行过程如下图所示:

7

相比于单向的 BFS,双向 BFS 只遍历了半颗树就得到了结果

但是双向 BFS 有一个缺点:必须知道终点才可以用

代码如下:

11 注:优化版的「判断节点是否已经访问」以及「加入访问集合中」的顺序有变化