本节重点是对宽度优先搜索算法的知识普及。
希望自己的博客能够通俗易懂,与君同学习,共进步。如果有任何心得或疑问,欢迎交流学习。
由于本人实力与精力有限,部分图片可能来源于网络,如有侵权,请联系我删除。
宽度优先搜索(Breadth First Search)是一个针对图和树的遍历算法。最初用于解决迷宫路径和网络路由等问题。
下面直接用树的一幅图来展示宽度优先搜索。从头节点1开始,其搜索顺序是1,2,3,4,5,6,7。
下面的操作步骤需要会背并可以转化为程序:
BFS使用队列来实施算法过程,具体操作步骤如下:
-
把起始点放入queue;(如果存在的话)/对应程序:非空判断;创建队列;放入第一个节点/
-
重复下述两个步骤,直到队列为空;/对应程序:循环判断队列是否为空,下面两句是循环体内容/
从队列中取出队列头的点;/对应程序:队列中取出一个节点/找到与此点邻接的尚未遍历的点,进行标记,然后全部放入队列中。/对应程序:队列中放入与取出点相邻的所有未遍历的非空点/
此过程非常简单简单,以下用文字进行描述,不再绘图哦。
1.创建队列;
2.放入第一个点(1);
3.循环体
取出1,放入2,3,此时队列有2,3
取出2,放入4,5,此时队列有3,4,5
…
最终循环体结束,队列无元素。
上述过程非常简单,但对于刚学习的同学,很建议自己完全的在心里想一下这个完整过程。
下面程序需要理解并背会
// 宽度优先搜索用于二叉树遍历
void BFS (TreeNode head) {
if (head == null) return null;
Queue<TreeNode> queue = new Linked<TreeNode>();
queue.offer(head);
while (!queue.isEmpty()) {
ListNode node = queue.poll();
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
}
/*
写道这里,其实二叉树的宽度优先遍历已经写完了,大家以后遇到的遍历时输出节点了,
按层输出等等其实都是在这个基础上添加了一些小功能而已。
*/
本博客知识点回顾习题
1.宽度优先搜索(Breadth First Search)是一个针对__和__的遍历算法。最初用于解决__和__等问题。
2.BFS使用__来实施算法过程,具体操作步骤是什么?
3.讲题目2中的操作步骤改写为程序。