宽度优先搜索(BFS)
1.什么时候使用BFS
1.图的遍历
-层级遍历
-由点及面(连通性)
-拓扑排序
2.最短路径
-仅限简单图求最短路径 ,即图中每条边的长度都是1(一样),且没有方向。
2.解树的遍历(层级遍历)
注:树是一种特殊的图,树属于图。
宽度优先搜索就是把二叉树的每一层依次压入队列。
步骤
1.创建一个队列,把起始节点放进去。
2. while 队列不空,处理队列中的节点,读出该节点的兄弟节点,并加入队列。
3. 把每一层的队列放入数组。
3.二叉树的序列化
序列化:object => String
反序列化:String => object
方法:Json
4.图的宽度优先搜索(连通性)
图:由点和边组成的。
在 图 和 树 中进行宽度优先搜索的区别:树有严格的上下级关系(父子关系),图是双向关系(邻居关系)。
所以在图中进行BFS可能会存在环,即同一节点可能会多次进入在队列中。在对图进行BFS时,需要记录这一节点有没有处理。综上,处理图的BFS需要用 HashMap。
树的充要条件:
1.有 N 个点, N-1 条边。
2.所有点连通。是否可以通过一个点(如顶点),找到所有点。
首先自己构造一个图的邻接表,如下图:
例:可以使用 HashMap + HashSet 的结构。 【Map(Integer,Set(Integer))】。
然后就是执行宽度优先搜索算法的步骤:
1、 创建一个队列,把首节点存入。
2、 while 当队列不为空的时候,弹出队列中的节点,并且读出该节点的邻居节点。
3、 判断邻居节点是否已被访问,若已访问,跳过;若未访问,加入队列。
5. 矩阵中的宽度优先搜索
图(Graph)的特点:若有 N个点,M条边
1、M最大是O(N^2)的级别。
2、图上BFS时间复杂度 = O(N+M),最坏情况为 O(N^2)。
矩阵(Matrix)的特点:若有 R行,C列
1、共有RC个点,2RC条边(每个点有上下左右四个方向,每个边连接两个点)
2、矩阵中 BFS时间复杂度 = O(RC)。
总结:能够用 宽度优先搜索(BFS)写的 就不用深度优先搜索(DFS)去写。