广度优先遍历(BFS)

树的广度优先遍历(层序遍历)和图的广度优先遍历的关系

树的广度优先遍历是层序遍历 从根节点横着一排一排遍历 找与其相邻的节点!找对应节点的孩子 图的广度优先遍历 也是找对应的连接的节点 不过 与树不同 过程中可能出现重复

代码实现

如果v是对应G的最后一个临边节点的话返回-1 可以退出循环 也是一个入队出队就是多加了个标记 这就是广度优先遍历

分析遍历序列

从2开始 对应的图出现对应遍历序列 可以手算 从1开始的话2,5最近 这里用邻接矩阵实现的话 离最近的有两个的话是按照 从小到大排序的 就是1 2 5 队列为2 5(1出栈) 然后访问2旁边的节点为6 队列变为 5 6(2出栈) 访问5没有 队列 6 访问6 3 7 访问3 7 4 访问 7 4 8 都访问过了最后4和8出队 对应的出队序列的话 就是访问顺序呗 1 2 5 6 3 7 4 8

邻接表存储变遍历序列的可变性

如果不是邻接矩阵存储的话是邻接表的话 对应的数组可能有多种情况 比如图中上面的话是2 1 6 下面的话就是 2 6 1了(排序不同)

算法存在问题(连通和非连通)

如果是非连通图的话,9-10-11这几个就都遍历不到

思路就是我们遍历一遍 visite数组找看还有没有对应是false的值 有的话 吧对应的节点再进行一次BFS()遍历

BFS算法(final版)

对于无向图来说,调用BFS的次数=连通分量数(极大连通子图)

复杂度分析

空间复杂度 队列最大长度 时间复杂度主要来自于访问顶点和各条边 邻接矩阵的话1.访问各顶点O(|V|)2.访问各条边需要对对应矩阵进行遍历就是O(|V^2|) O(|V^2|)+O(|V|)省去O(|V|) ,结果为O(|V^2|) 邻接表的话 就是访问各个顶点和边就ok O(|V+E|)

广度优先生成树

你在遍历的时候 通过一条边访问对应的节点 最后是没有回路的把没有访问的边都去掉就生成了一颗 树(这棵树被称为广度优先生成树)

这里的结果是邻接矩阵还有邻接表按顺序存储节点 若3和7调换 就是先过7了 7 4 8 可以把4节点和8节点全访问一遍 就用不到3了 注意:先访问的放左子树,后访问的放右子树

广度优先生成树邻接表的话,不唯一

广度优先生成森林

对于非连通表的连通分量搞广度优先树的操作就是广度优先生成森林

练习:有向图的BFS过程

总结

图的深度优先遍历(DFS)

树的深度优先遍历(先根遍历)

因为图的深度优先类似于树的先根遍历这里我们举例先根 还是一样新找到的节点可能是访问过的 还是要多加一个标记数组

分析

这里多添的是一个栈奥,这是系统栈(不用自己添加)我们只是分析编译器递归过程

如图奥 从2开始遍历1 和 6 1比较近先访问1,然后访问1的子节点5 5的话相邻的1被访问过了,5和1出栈剩2 然后就再访问2节点 发现6 6发现3 和 7 先3 3后面是4 然后4 和3返回 到7 7 8 最后8和7再返回 然后6和2返回 栈空

DFS算法(Fianl版)

还是那个问题奥 就是非连通图 还是遍历我们那个标记数组呗

复杂度分析

空间复杂度

没有说明答最坏情况

时间复杂度和广度优先是类似的

深度优先遍历序列

还是有多种可能性奥 如果邻接表就是递增存放的话和邻接矩阵一样 邻接表不一样就不一样呗具体情况具体分析 这种是不按递增存储自己练习一下 主要想强调的是不唯一性

深度优先生成树

和广度优先生成树差不多 也是只保留我们访问过的边 生成一棵树 也是邻接表存储不一样生成树不一样

深度优先生成森林

不连通的图 对连通分量进行深度优先生成树 最后出来就是深度优先森林喽

总结

遍历的图的连通性

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。