图的广度优先遍历_每天5分钟用C#学习数据结构(23)图 Part 4

fc36944d27859b31b63a9f493dc8aa7c.png

【基础知识】| 作者 / Edison Zhou

这是恰童鞋骚年的第219篇原创文章


上一篇介绍了图的遍历算法之深度优先搜索遍历,本篇开始介绍图的广度优先搜索遍历。

1广度优先遍历原理

图的广度优先遍历算法是一个分层遍历的过程,和二叉树的广度优先遍历类似,其基本思想在于:从图中的某一个顶点Vi触发,访问此顶点后,依次访问Vi的各个为层访问过的邻接点,然后分别从这些邻接点出发,直至图中所有顶点都被访问到。

38b6e1773e1bf356522868609163d5de.png

对于上图所示的无向连通图,若从顶点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

测试代码如下所示:

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

3小结

本篇介绍并实现图的广度优先搜索遍历算法,下一篇,我们再来看看非连通图如何实现遍历。

4参考资料

程杰,《大话数据结构》

陈广,《数据结构(C#语言描述)》

段恩泽,《数据结构(C#语言版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值