关于BFS的思考
在蓝桥杯的考试中,有几道经典的BFS例题,可以先从里面入手
本题可以说是BFS入门题,由于BFS的特性是一层一层的搜,那么我们总可以求出最短路径,按照这个思想,我们可以写出以下代码
1 | public class Main { |
下面说一下BFS框架
1 | void BFS(){ |
以上情况适用于图的BFS遍历,但是相对于树来说,应该更为简单,其中vis在大部分时候都是必须的,但是像一般的二叉树结构,因为只有父亲指向儿子,并没有儿子指向父亲的节点,那么一般来说我们不需要对其进行标记。
下面讲一道关于树的经典BFS遍历
Leetcode102、二叉树的层序遍历 https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
1 | class Solution { |
或许通过这一道例题,只是简单的按层进行了遍历,并不能给你直观带来BFS求最短路径的感受,那么接下来通过一道题来求解最短路径
1 | class Solution { |
BFS的逻辑就是,depth每增加一次,队列中的所有节点都向前迈一步,这就保证了第一次到达终点时,走的步数是最少的。
即BFS可以借助队列做到一次一步,齐头并进的感觉,相对于DFS来说,可以在不遍历完整棵树的情况下找到最短距离。
青蛙跳杯子
1 | import java.util.*; |
九宫重排
1 | public class Main { |
以上的青蛙跳杯子以及九宫重排,本质上属于同一类题,但是这里运用了两种不同的写法来进行。
一种是利用面向对象的思想,我们自己定义一个节点类,这样可以将每次的路径和步数传进去。而第二种写法则是利用最开始的模板,每当我们更新完一层,那么就更新结果为步数+1。