![fc36944d27859b31b63a9f493dc8aa7c.png](https://i-blog.csdnimg.cn/blog_migrate/f4b58716a19332b60bb699af92679609.jpeg)
【基础知识】| 作者 / Edison Zhou
这是恰童鞋骚年的第219篇原创文章
上一篇介绍了图的遍历算法之深度优先搜索遍历,本篇开始介绍图的广度优先搜索遍历。
1广度优先遍历原理
图的广度优先遍历算法是一个分层遍历的过程,和二叉树的广度优先遍历类似,其基本思想在于:从图中的某一个顶点Vi触发,访问此顶点后,依次访问Vi的各个为层访问过的邻接点,然后分别从这些邻接点出发,直至图中所有顶点都被访问到。
![38b6e1773e1bf356522868609163d5de.png](https://i-blog.csdnimg.cn/blog_migrate/df3f45a93b7e611e54d89e45b933dd33.jpeg)
对于上图所示的无向连通图,若从顶点V1开始,则广度优先遍历的顶点访问顺序是V1→V2→V3→V4→V5→V6→V7→V8。
2广度优先遍历实现
代码实现
/// /// 宽度优先遍历接口For连通图/// public void BFSTraverse(){ InitVisited(); // 首先初始化visited标志 BFS(items[0]); // 从第一个顶点开始遍历}/// /// 宽度优先遍历算法/// /// 顶点private void BFS(Vertex v){ v.isVisited = true; // 首先将访问标志设为true标识为已访问 Console.Write(v.data.ToString() + " "); // 进行访问操作:这里是输出顶点data Queue> verQueue = new Queue>(); // 使用队列存储 verQueue.Enqueue(v); while (verQueue.Count > 0) { Vertex w = verQueue.Dequeue(); Node node = w.firstEdge; // 访问此顶点的所有邻接节点 while (node != null) { // 如果邻接节点没有被访问过则访问它的边 if (node.adjvex.isVisited == false) { node.adjvex.isVisited = true; // 设置为已访问 Console.Write(node.adjvex.data + " "); // 访问 verQueue.Enqueue(node.adjvex); // 入队 } node = node.next; // 访问下一个邻接点 } }}
和树的层次遍历类似,借助了队列这一数据结构进行辅助,记录顶点的邻接点。
遍历测试
这里构造的图如下所示,跟上面原理中的图一致:
![38b6e1773e1bf356522868609163d5de.png](https://i-blog.csdnimg.cn/blog_migrate/df3f45a93b7e611e54d89e45b933dd33.jpeg)
测试代码如下所示:
static void MyAdjacencyListTraverseTest(){ MyAdjacencyList adjList = new MyAdjacencyList(); // 添加顶点 adjList.AddVertex("V1"); adjList.AddVertex("V2"); adjList.AddVertex("V3"); adjList.AddVertex("V4"); adjList.AddVertex("V5"); adjList.AddVertex("V6"); adjList.AddVertex("V7"); adjList.AddVertex("V8"); // 添加边 adjList.AddEdge("V1", "V2"); adjList.AddEdge("V1", "V3"); adjList.AddEdge("V2", "V4"); adjList.AddEdge("V2", "V5"); adjList.AddEdge("V3", "V6"); adjList.AddEdge("V3", "V7"); adjList.AddEdge("V4", "V8"); adjList.AddEdge("V5", "V8"); adjList.AddEdge("V6", "V8"); adjList.AddEdge("V7", "V8"); Console.Write("广度优先遍历:"); // BFS遍历 adjList.BFSTraverse(); Console.WriteLine();}
运行结果如下图所示(下图文本输出应该是广度,复制的没有改,请见谅):
![ba060f7717657870ac083478d0721e70.png](https://i-blog.csdnimg.cn/blog_migrate/2d159a5add6a16e4b1d49674b289e7f2.jpeg)
3小结
本篇介绍并实现图的广度优先搜索遍历算法,下一篇,我们再来看看非连通图如何实现遍历。
4参考资料
程杰,《大话数据结构》
陈广,《数据结构(C#语言描述)》
段恩泽,《数据结构(C#语言版)》