BFS算法框架详解
DFS就是回溯算法,BFS的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。
BFS相对DFS最主要的区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度比DFS大很多。
本文主要讲解两道BFS相关的题目,分别是【二叉树的最小高度】和【打开密码锁的最少步数】。
一.算法框架
BFS问题的本质是让你在一副图中**找到从起点start到终点target的最近距离
**。
BFS的框架如下:
//计算从起点start到终点target的最近距离
int BFS<Node start,Node target>{
Queue<Node> q;//核心数据结构
Set<Node>visited;//避免走回头路
q.offer(start);//将起点加入队列
visited.add(start);
int step = 0; //记录扩散的步数
while(q not empty){
int sz = q.size();
/*将当前队列中的所有节点向四周扩散*/
for(int i=0;i<sz;i++)
{
Node cur =q.poll();
/*划重点:这里判断是否到达终点*/
if (cur is target)
return step;
/* 将cur的相邻节点加入队列*/
for(Node x:cur.adj())
if (x not in visited){
q.offer(x);
visited.add(x);
}
}
step++;
}
}
像二叉树这样的数据结构,没有子节点到父节点的指针,不会回头就不需要visited。
二.二叉树的最小高度
首先,得明确起点start和终点target。
显然起点就是root,终点就是最靠近根节点的那个【叶子节点】,叶子节点就是两个子节点都是null的节点。
int minDepth(TreeNode root){
if(root == null) return 0;
Queue<TreeNode> q=new LinkedList<>();
q.offer(root);
int depth =1;//root本身就是一层,depth初始化为1
while(!q.isEmpty()){
int sz=q.size();
//将当前队列中的所有节点扩散
for(int i=0;i<