图的二种遍历-广度优先遍历和深度优先遍历

这篇具有很好参考价值的文章主要介绍了图的二种遍历-广度优先遍历和深度优先遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图的广度优先遍历

1.树的广度优先遍历

这样一个图中,是如何实现广度优先遍历的呢,首先,从1遍历完成之后,在去遍历2,3,4,最后遍历5 ,6 , 7  , 8。这也就是为什么叫做广度优先遍历,是一层一层的往广的遍历

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点


树的广度优先遍历(层序遍历)

①若树非空,则根节点入队


②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队

③重复②直到队列为空

2.图的广度优先遍历

图的广度优先和树的广度优先还是非常相似的,首先我们假设我们从 2 号结点开始,然后广度优先遍历 1 ,  6 (这里面1和6的顺序无所谓,但是还是为了保持一定的顺序,一般从小的开始)然后1的话再遍历就是5 , 6再找相邻的就是 3 和 7 ,于是访问的就是 5 ,3  ,7 。在找到下一层就是 4 ,8 。

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

广度优先遍历(Breadth-First-Search, BFS)要点:

1.找到与一个顶点相邻的所有顶点·
2、标记哪些顶点被访问过
3.需要一个辅助队列


FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。
NextNeighbor(G,x,y)︰假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
 

代码

bool visited [MAX_VERTEX_NUM];/访问标记数组

//广度优先遍历
void BFS( Graph G,int v){//从顶点v出发,广度优先遍历图G
	visit(v);	//访问初始顶点v
	
	visited [v]=TRUE;	//对v做已访问标记
	
	Enqueue(Q,v);     //顶点v入队列Q
	
	while( !isEmpty(Q) ){
	DeQueue(Q, v);    //顶点v出队列
	for(w=FirstNeighbor(G,v ) ;w>= ;  w=NextNeighbor(G,v,w))
	//检测v所有邻接点
	if( !visited [w] )//w为v的尚未访问的邻接顶点
	{
	   visit(w);//访问顶点w
	   visited [w]=TRUE;//对w做已访问标记
	   EnQueue(Q,w);//顶点w入队列

	}
}

按照上面的例子,首先

我们先遍历到 2 ,2 放到队列,如果队列不空,把 1 和 6 放到队尾,然后 1号出队,和 1号邻的为

5和 2 ,由于 2被visit了所以访问未被访问的结点5,5号结点入队,都访问完了,看六号结点,六号结点出队。6号结点相邻的且未被访问的是3 , 7 。visit 3 和 7 并且都放在队尾,然后看3 ,和3相邻的且未被访问的是4 号,访问4号结点,让4 号结点入队,最后,3号出队,看7号结点,与7号结点相邻的且未被访问的是8号结点。最后所有结点都被访问。

 firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法 

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

 

3.算法存在的问题和解决方案

前面介绍的都是连通图,如果是非连通图,那么上面算法就实现不了。我们可以直接从0号结点开始,遍历所有结点查看是否有未被访问的结点,找到第一个值为false的结点。从这个结点出发调用BFS。

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

 

代码

bool visited [MAX_VERTEX_NUM] ;   //访问标记数组
void BFSTraverse(Graph G){       //对图G进行广度优先遍历
   for( i=0; i<G.vexnum;++i)
       visited[i]=FALSE;          //访问标记数组初始化
   InitQueue(Q);                //初始化辅助队列Q
   for( i=0; i<G.vexnum;++i)    //从0号顶点开始遍历
      if( !visited[i])            //对每个连通分量调用一次BFS
         BFS(G,i);               // vi未访问过,从vi开始BFS
}

bool visited [MAX_VERTEX_NUM];/访问标记数组

//广度优先遍历
void BFS( Graph G,int v){//从顶点v出发,广度优先遍历图G
	visit(v);	//访问初始顶点v
	
	visited [v]=TRUE;	//对v做已访问标记
	
	Enqueue(Q,v);     //顶点v入队列Q
	
	while( !isEmpty(Q) ){
	DeQueue(Q, v);    //顶点v出队列
	for(w=FirstNeighbor(G,v ) ;w>= ;  w=NextNeighbor(G,v,w))
	//检测v所有邻接点
	if( !visited [w] )//w为v的尚未访问的邻接顶点
	{
	   visit(w);//访问顶点w
	   visited [w]=TRUE;//对w做已访问标记
	   EnQueue(Q,w);//顶点w入队列

	}
}

 

4.知识回顾与总结

 

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法


 

图的深度优先遍历

1.树的深度优先遍历

树的深度优先遍历有点类似于先根遍历

首先遍历 1 2 5 6 3  4 7 8 ,它的遍历更趋向于先深层的遍历树。

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

 

2.图的深度优先遍历

首先我们可以先看一下2,和2相邻的是1号结点和6号结点。和2相邻的第一个结点是1,所以先访问1,1号结点未被访问。和1号结点相邻的为2 号和5号,但是2号被访问过了,所以看5号结点。和5号结点相邻的结点点都被访问过。这个顶点的DFS调用完,返回到1号接点调用层,但是1号节点调用都被调用完了,那么就可以返回2号结点调用层,2号结点身边的结点未被访问。即是6号结点。和6号结点相近的且未被访问的是 3和 7号结点,先访问3号结点,下一个应该被访问的是4号结点,和4号相邻的且未被访问的是7号结点,最后8号结点未被访问,访问一下8号结点。

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法

 

代码

bool visited [MAX_VERTEX_NUM] ;//访问标记数组
void DFS(Graph G,int v){    //从顶点v出发,深度优先遍历图G
   visit(v );   //访问顶点v
   visited [v]=TRUE;   //设已访问标记
   for( w=FirstNeighbor(G,v) ;w>=0 ; w=NextNeighor(G,v,w) )
   if( !visited [w] ){    //w为u的尚未访问的邻接顶点
      DFS(G,w) ;
}

 

3.算法存在的问题和解决方案

与广度优先算法一样,如果存在非连通图,那么同样的,我们可以直接从0号结点开始,遍历所有结点查看是否有未被访问的结点,找到第一个值为false的结点。从这个结点出发调用BFS。

最终代码

bool visited [MAX_VERTEX_NUM];//访问标记数组
void DFSTraverse(Graph G){   //对图G进行深度优先遍历
   for( v=0; v<G.vexnum;++v)
     visited[v]=FALSE;       //初始化已访问标记数据
   for( v=0 ; v<G.vexnum; ++v)   //本代码中是从v=0开始遍历
     if( !visited[v])
       DFS(G,v);
}


bool visited [MAX_VERTEX_NUM] ;//访问标记数组
void DFS(Graph G,int v){    //从顶点v出发,深度优先遍历图G
   visit(v );   //访问顶点v
   visited [v]=TRUE;   //设已访问标记
   for( w=FirstNeighbor(G,v) ;w>=0 ; w=NextNeighor(G,v,w) )
   if( !visited [w] ){    //w为u的尚未访问的邻接顶点
      DFS(G,w) ;
}

4.知识回顾与总结

 

firstneighbor(g,v),数据结构,王道数据结构,深度优先,宽度优先,算法文章来源地址https://www.toymoban.com/news/detail-783742.html

到了这里,关于图的二种遍历-广度优先遍历和深度优先遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图的遍历-深度优先遍历与广度优先遍历(C语言)

    图的遍历 概念:指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 邻接矩阵及邻接表的创建 : 图的存储结构-无向邻接矩阵与无向邻接表(C语言). 结构定义 邻接矩阵的深度优先遍历操作 邻接矩阵的深度优先递归算法 结构定义 邻接表的深度优先遍

    2024年02月06日
    浏览(48)
  • 大话数据结构-图的深度优先遍历和广度优先遍历

      图的遍历分为深度优先遍历和广度优先遍历两种。   深度优先遍历(Depth First Search),也称为深度优先搜索,简称DFS,深度优先遍历,是指从某一个顶点开始,按照一定的规则,访问并记录下一个未访问顶点。对于非连通图,则是按连通分量,采用同一规则进行深度优

    2024年02月04日
    浏览(58)
  • 图的遍历之 深度优先搜索和广度优先搜索

    深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至

    2024年02月13日
    浏览(52)
  • 蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    这两种搜索方法本质上都是基于蛮力法思路 这两种搜索方法对有向图和无向图都适用 1.1 邻接矩阵 邻接矩阵示意图: 1.2 邻接表 注意:边结点代表的是图中的边,而并非图中的结点;头结点才表示图中的结点;头结点身后所连接的为边结点 邻接表示意图:(一般默认为出边

    2024年02月05日
    浏览(66)
  • (超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

            根据下图,编写代码实现图的深度优先遍历和广度优先遍历。          按照英文字母顺序,以邻接表为存储结构,实现图的深度优先和广度优先遍历。遍历的顺序从顶点a开始。 以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。   (1)从顶点a,

    2024年02月08日
    浏览(60)
  • 图详解第二篇:图的遍历(广度优先+深度优先)

    所谓图的遍历: 即从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。 ps: 我们后面讲解这些图相关的算法默认都针对邻接矩阵结构的图去讲解,

    2024年02月08日
    浏览(58)
  • 【数据结构与算法】图的深度优先和广度优先遍历

    😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页 ✨✨座右铭✨✨ : 坚持到底,决不放弃,是成功的保证,只要你不放弃,你就有机会,只要放弃的人,他肯定是不会成功的人。 图是一

    2024年02月02日
    浏览(58)
  • 【数据结构】图的遍历:广度优先(BFS),深度优先(DFS)

    目录 1、广度优先(BFS) 算法思想  广度优先生成树  知识树  代码实现  2、深度优先(DFS) 算法思想  深度优先生成树 知识树  代码实现           图的广度优先遍历(BFS)是一种遍历图的算法,其思想是从起始顶点开始遍历图,先访问起始顶点的所有直接邻居,然

    2024年02月04日
    浏览(66)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次。(连通图与非连通图) 1、访问指定的起始顶点; 2、若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕; 3、若

    2024年01月17日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包