图的遍历详解(广度优先和深度优先)
数据结构的算法实践留作业啦,我选了图的遍历这一块,因为感觉比起其他的题目的话,会更加的清楚相关算法,写这篇文章是为了能够让大家更加清楚图的遍历算法,也是为了自己能够再进行一次相关知识的回顾,帮助自己答辩时顺利通关,希望答辩顺利!!!也希望看到文章的宝贝们对图的遍历这一部分更加清楚!!❤
对了,图的遍历可视化也已经完成,大家有兴趣可以看一下
https://blog.csdn.net/zhang2gongzi/article/details/122411789?spm=1001.2014.3001.5501
——————————————————————————————
一、 什么是图的遍历
图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次(访问一次,但不止用到一次)。 图的遍历操作和树的遍历操作功能相似(二叉树的前序,中序,后序遍历,本质上也可以认为是深度优先遍历、而二叉树的层序遍历,本质上也可以认为是广度优先遍历)。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上。
就比如你想出去逛街,街上有很多店,a,b,c,d,e,f,g,要怎么才能把他们都逛呢,假如运用我们图的遍历的操作,那么就可以通过广度优先和深度优先来进行安排
那么了解什么是图的遍历之后,我们来了解一下什么是广度遍历和深度遍历呢
**
二、广度遍历
**
广度优先遍历(Breadth First Search),又称为广度优先搜索,简称BFS。
是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。
其实他本意就是,先遍历一个节点,然后遍历那个节点所连接的的周边节点,之后再一个结点一个结点的往外遍历,重复循环
大家还记得我上面举例子的这张图吗,如果按照广度优先遍历的话,那么访问顺序为a、b、c、d、e、f、g、h。
就是从上面一层层的遍历下来,这张图是二叉树的样式,所以可能比较容易让大家理解,那么我们现在换成图来一起做一次
那么这张图,我们设从“3”开始遍历,运用广度优先的方法,那么我们所得到的遍历顺序为3,2,3,4,5,1;
**
三、深度遍历
**
https://blog.csdn.net/qq_42024195/article/details/88350544?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E9%81%8D%E5%8E%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-88350544.pc_search_result_control_group&spm=1018.2226.3001.4187
这里的话,我借鉴了一下大佬的图,因为我觉得大佬这几张动画图,真的很棒,就我看的话,还是挺清楚的
首先时算法思路部分
深度优先搜索类似于树的先序遍历,具体过程如下:
准备工作:创建一个visited数组,用于记录所有被访问过的顶点。
1.从图中v0出发,访问v0。
2.找出v0的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直至刚访问过的顶点没有未被访问的邻接点为止。
3.返回前一个访问过的仍有未被访问邻接点的顶点,继续访问该顶点的下一个未被访问领接点。
4.重复2,3步骤,直至所有顶点均被访问,搜索结束。
**
四、代码部分
**
#include<stdio.h>
#include<stdlib.h>
#define max 20
typedef struct EdgeNode//边表结点
{ int adjvex; //存储顶点对应的下标 存储的是一个位置,而非具体元素,为了以后改变数据方便操作 struct EdgeNode *next;//链域指向下一个邻接点 int weight; //权值(问题中有权值再用)
}EdgeNode;
typedef struct VertexNode//顶点表结点
{ char data;//存放顶点信息 EdgeNode *firstedge;//指向边表中第一个结点
}VertexNode;
typedef struct
{ VertexNode adjlist[20];int n,e;
}GraphAdjlist;//声明图的邻接表类型
int visited[10];//访问标志数组 (访问过赋值为1,反之为0) void create(GraphAdjlist *G)//创建邻接表
{ int i,j,k;EdgeNode *e;printf("请输入顶点数和边数:");scanf("%d%d",&G->n,&G->e);getchar();//清除缓冲 printf("请输入顶点边号:\n");for(i=0;i<G->n;i++){ scanf("%c",&G->adjlist[i].data);//输入顶点编号G->adjlist[i].firstedge=NULL;//将边表置空 getchar(); }for(k=0;k<G->e;k++){ printf("输入边(Vi,Vj)上的顶点序号:\n");scanf("%d%d",&i,&j);//头插法方便,快速 如果用尾插法需要指针遍历到尾部,太慢 /*使用头插法加入边表结点*/e=(EdgeNode *)malloc(sizeof(EdgeNode));e->adjvex=j;e->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=e;e=(EdgeNode *)malloc(sizeof(EdgeNode));//因为是无向图,一条边对应两个顶点 e->adjvex=i;e->next=G->adjlist[j].firstedge; G->adjlist[j].firstedge=e; } printf("\n");
}
void DFS(GraphAdjlist *G,int i)
{ EdgeNode *p;visited[i]=1;printf("%c ",G->adjlist[i].data);p=G->adjlist[i].firstedge;while(p!=NULL){ if(visited[p->adjvex]==0)DFS(G,p->adjvex);p=p->next;}
}
void DFSTraverse(GraphAdjlist *G)
{ int i;for(i=0;i<G->n;i++)visited[i]=0;for(i=0;i<G->n;i++)if(visited[i]==0)DFS(G,i);
}
void BFS(GraphAdjlist *G,int v)
{ EdgeNode *p;int queue[max],front=0,rear=0;//定义循环队列并初始化 int w,i;for(i=0;i<G->n;i++)//标志数组初始化 visited[i]=0;printf("%2c",G->adjlist[v].data);visited[v]=1;rear=(rear+1)%max;queue[rear]=v;while(front!=rear){ front=(front+1)%max;w=queue[front];p=G->adjlist[w].firstedge;while(p!=NULL){ if(visited[p->adjvex]==0){ printf("%2c",G->adjlist[p->adjvex].data);visited[p->adjvex]=1;rear=(rear+1)%max;queue[rear]=p->adjvex;}p=p->next;}}printf("\n");
}
int main()//A B C D E
{ GraphAdjlist G;create(&G);printf("深度优先遍历:");DFSTraverse(&G);printf("广度优先遍历:");BFS(&G,0); return 0;
}
明天就要答辩了,所以比较赶,时间不太来的及,大家先凑合者看吧,等答辩完我再补
图的遍历详解(广度优先和深度优先)相关推荐
- 图遍历详解(C语言版)
文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...
- 二叉树层次遍历算法 python_二叉树的遍历详解:前、中、后、层次遍历(Python实现)...
二叉树的遍历详解:前.中.后.层次遍历(Python实现) 二叉树是一种常见的数据结构,而它的常见遍历方法有前序遍历.中序遍历.后续遍历.层次遍历--掌握这几种遍历方法是很有必要的. 假设我们二叉树节 ...
- 不带头节点的链表有哪些缺点_23张图!万字详解「链表」,从小白到大佬!
链表和数组是数据类型中两个重要又常用的基础数据类型. 数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解 ...
- 图之邻接矩阵详解(C语言版)
文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 图的邻接矩阵是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构.设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: ...
- 雪碧图PHP,Webpack中雪碧图插件使用详解
背景 在开发过程中,我们需要用到很多图标,这些图标的大小不是很大,但是每次需要向服务器发送请求,从而加重服务器的负担,尤其是当网站处于高访问量的情况下或网络不稳定的时候,服务器性能会明显下降.这种情况 ...
- hugegraph图数据库索引详解
hugegraph图数据库索引详解 版权声明:转载请注明出处 https://blog.csdn.net/u010260089/article/details/86712983 前言 在<技术文 ...
- 原创:Spark中GraphX图运算pregel详解
原创:Spark中GraphX图运算pregel详解 由于本人文字表达能力不足,还是多多以代码形式表述,首先展示测试代码,然后解释: package com.txq.spark.test import ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 数据结构图,图存储结构详解
1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...
- 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...
最新文章
- Facebook人工智能副总裁:AI 这一领域很快就会「碰壁」
- 微软商店安装包_搞定你的数学问题:微软发布新APP可以手写或扫描数学题进行解答...
- 白沙工业园新松机器人_常州中智永浩助推机器人行业高质发展 打造机器人领域新优势...
- 1.解读REST和JAX-RS
- 人生,不过是停下在走
- 大学计算机成绩统计表怎么做,wps怎么制作成绩表 wps设计成绩统计表的步骤方法...
- $NOIp2018$劝退记
- Android Studio 使用艺术 - Android Windows 开发环境配置
- 如何在经济危机中寻找崛起之道
- 数据结构与算法笔记总结
- Spring Boot 打的包为什么能直接运行?
- 销售订单的 状态 变更
- 算法笔记练习 题解合集
- 算法导论适合c语言吗,看《算法导论》需要多好的数学基础?
- Ps cc 2014 安装与错误修改
- 打印机显示rpc服务器,win10打印机出现RPC服务器不可用的处理办法
- 图算法设计之用普里姆Prim算法构造最小生成树
- JAVA经典面试题(来源于互联网)
- 2022年终几段晋升、述职等汇报文案参考
- 企业数据安全三大壁垒:MDM、MIM和MAM
热门文章
- mysql repair table_mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)
- linux 分区怎样缩小,如何缩小磁盘分区大小
- WARNING:tensorflow:sample_weight modes were coerced from ... to [‘...‘]
- 【代码质量】如何使用Valgrind检测内存泄漏
- 二叉树(知道中序遍历和后序遍历得到先序遍历)
- 百度云文字识别demo
- 腾讯云mysql最大数据量_被低估的腾讯云数据库
- PVE7.2 显示CPU温度和频率
- php function overridden,php在函数外声明global变量有什么用?
- 马斯洛提出动机理论_马斯洛的需要层次理论