图的两种遍历:深度优先遍历+广度优先遍历

article/2025/9/20 6:55:36

一、深度优先遍历

1、简介

深度优先遍历是指按照深度方向搜索,它类似于树的先根遍历,是树的先根遍历的推广。

基本思想(通俗)

选一条路走到 ,直到 走不通,就 原路返回看看 是否还有路可走,如果返回到起点还无路可走,说明深度优先遍历已完成。

2、举例说明

这是要深度遍历的无向图

 

 深度遍历依次访问的为:

v1->v2->v4->v8->v5->v3->v6->v7

3、C语言代码 

(1)邻接矩阵存储无向图。

12345678
101100000
210011000
310000110
401000001
501000001
600100000
700100000
800011000

对于图的存储,请参考我的文章:图的三种存储结构:邻接矩阵表示法+链表法+十字链表法

存储无向图

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEM_NUM 10 
#define INFINITY 32768typedef enum{DG,DN,UDG,UDN	
}graghKind;
//digraph  DG有向图
//directed network  DN有向网
//undirected graph  UDG无向图
//undirected network  UDN无向网typedef char vertemData;typedef struct {vertemData vert[MAX_VERTEM_NUM];			//顶点向量int adj[MAX_VERTEM_NUM][MAX_VERTEM_NUM];	//邻接矩阵int vertNum,arcNum;							//图的顶点数和弧数graghKind gragh;							//图的类型
}adjMatrix;//求顶点位置
int locateVertem(adjMatrix *G,vertemData v){for(int j=0;j<G->vertNum;j++){if(G->vert[j]==v){return j;}}
}//创建无向图
int creatUDG(adjMatrix *G){int i,j,k,weight;vertemData v1,v2;printf("请输入图的顶点数和弧数:\n");scanf("%d %d",&G->vertNum,&G->arcNum);for(i=0;i<G->vertNum;i++)for(j=0;j<G->vertNum;j++)G->adj[i][j] = 0;	for(i=0;i<G->vertNum;i++){printf("请输入图的顶点%d:\n",i);getchar();scanf("%c",&G->vert[i]);}for(k=0;k<G->arcNum;k++){printf("请输入弧%d的两个顶点:\n",k);getchar();scanf("%c %c",&v1,&v2);i = locateVertem(G,v1);j = locateVertem(G,v2);G->adj[i][j] = 1;G->adj[j][i] = 1;}printf("\n无向图存储完毕!\n\n");	return 0;
}

运行结果

(2) 用一个数组去存储已访问点的信息

01234567
00000000

0代表该点未访问,1代表该点访问了。

(3)深度遍历的算法描述

  • 更新访问点数组信息,在邻接矩阵当中找到该访问点的最近的邻接点,访问该邻接点,输出遍历顶点信息,重复此步骤。
  • 当无法继续深度遍历的时候,在访问点数组中往后依次退1,直到能有一个顶点能继续深度遍历。
  • 当起点都无法继续深度遍历的时候,对图的深度遍历已完成

实际就是从第n个顶点开始、标记该顶点已被访问,然后查找该顶点第一个未访问的邻接点第i个顶点,再去第i个顶点 深度遍历。

实际就是一个递归的过程。

//深度遍历无向图
void depth_first_traversal_UDG(adjMatrix *G,int *v,int n)
{int i;if(G==NULL) return;if(n<0||n>G->vertNum) return;v[n] = 1;if(n==0) printf("%c",G->vert[n]);else printf("->%c",G->vert[n]);for(i=0;i<G->vertNum;i++)if(G->adj[n][i]!=0&&v[i]!=1) depth_first_traversal_UDG(G,v,i);	
}

(4)完整代码 

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEM_NUM 10 
#define INFINITY 32768typedef enum{DG,DN,UDG,UDN	
}graghKind;
//digraph  DG有向图
//directed network  DN有向网
//undirected graph  UDG无向图
//undirected network  UDN无向网typedef char vertemData;typedef struct {vertemData vert[MAX_VERTEM_NUM];			//顶点向量int adj[MAX_VERTEM_NUM][MAX_VERTEM_NUM];	//邻接矩阵int vertNum,arcNum;							//图的顶点数和弧数graghKind gragh;							//图的类型
}adjMatrix;//求顶点位置
int locateVertem(adjMatrix *G,vertemData v){for(int j=0;j<G->vertNum;j++){if(G->vert[j]==v){return j;}}
}//创建无向图
int creatUDG(adjMatrix *G){int i,j,k,weight;vertemData v1,v2;printf("请输入图的顶点数和弧数:\n");scanf("%d %d",&G->vertNum,&G->arcNum);for(i=0;i<G->vertNum;i++)for(j=0;j<G->vertNum;j++)G->adj[i][j] = 0;	for(i=0;i<G->vertNum;i++){printf("请输入图的顶点%d:\n",i);getchar();scanf("%c",&G->vert[i]);}for(k=0;k<G->arcNum;k++){printf("请输入弧%d的两个顶点:\n",k);getchar();scanf("%c %c",&v1,&v2);i = locateVertem(G,v1);j = locateVertem(G,v2);G->adj[i][j] = 1;G->adj[j][i] = 1;}printf("\n无向图存储完毕!\n\n");	return 0;
}//深度遍历无向图
void depth_first_traversal_UDG(adjMatrix *G,int *v,int n)
{int i;if(G==NULL) return;if(n<0||n>G->vertNum) return;v[n] = 1;if(n==0) printf("%c",G->vert[n]);else printf("->%c",G->vert[n]);for(i=0;i<G->vertNum;i++)if(G->adj[n][i]!=0&&v[i]!=1) depth_first_traversal_UDG(G,v,i);	
}int main(){adjMatrix *G = (adjMatrix*)malloc(sizeof(adjMatrix));creatUDG(G);int visited[G->vertNum]={0};printf("深度优先遍历无向图:\n");depth_first_traversal_UDG(G,visited,0);return 0;
}

运行结果

 附

二、广度优先遍历

1、简介

广度优先搜索是指按照广度方向搜索,它类似于树的按层次遍历,是树的按层次遍历的推广。

基本思想(通俗)

把一层的邻接点访问完后再去访问下一层。

2、举例说明

这是要广度遍历的无向图

对无向图进行广度优先遍历:

v1->v2->v3->v4->v5->v6->v7->v8 

3、C语言代码

(1)算法描述

当访问到n层的时候,依次入队列,出队列的顶点访问其邻接点并入队列。

广度遍历上图的情况下队列的变化如下:

1
2 3
3 4 5
4 5 6 7
5 6 7 8
6 7 8
7 8
8

(2)完整代码

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEM_NUM 10 typedef enum{DG,DN,UDG,UDN	
}graghKind;
//digraph  DG有向图
//directed network  DN有向网
//undirected graph  UDG无向图
//undirected network  UDN无向网typedef char vertemData;
int visited[MAX_VERTEM_NUM] = {0};//访问数组/*邻接矩阵*/
typedef struct {vertemData vert[MAX_VERTEM_NUM];			//顶点向量int adj[MAX_VERTEM_NUM][MAX_VERTEM_NUM];	//邻接矩阵int vertNum,arcNum;							//图的顶点数和弧数graghKind gragh;							//图的类型
}adjMatrix;/*队列结构*/
typedef struct QNode
{vertemData data;struct QNode *next;
}QNode;typedef struct
{QNode *front,*rear;  //队头队尾指针 
}LinkQueue;/*求顶点位置*/
int locateVertem(adjMatrix *G,vertemData v){for(int j=0;j<G->vertNum;j++){if(G->vert[j]==v){return j;}}
}/*创建无向图*/
int creatUDG(adjMatrix *G){int i,j,k,weight;vertemData v1,v2;printf("请输入图的顶点数和弧数:\n");scanf("%d %d",&G->vertNum,&G->arcNum);for(i=0;i<G->vertNum;i++)for(j=0;j<G->vertNum;j++)G->adj[i][j] = 0;	for(i=0;i<G->vertNum;i++){printf("请输入图的顶点%d:\n",i);getchar();scanf("%c",&G->vert[i]);}for(k=0;k<G->arcNum;k++){printf("请输入弧%d的两个顶点:\n",k);getchar();scanf("%c %c",&v1,&v2);i = locateVertem(G,v1);j = locateVertem(G,v2);G->adj[i][j] = 1;G->adj[j][i] = 1;}printf("\n无向图存储完毕!\n\n");	return 0;
}/*创建空队列*/
int init_queue(LinkQueue *L)
{L->front=L->rear=(QNode*)malloc(sizeof(QNode));if(!L->front) return 0;L->front->next=NULL;return 0;	
}/*判断队列是否为空*/
int empty_queue(LinkQueue *L)
{if(L->front->next==NULL) return 1;else return 0;
}/*入队列*/
int in_queue(LinkQueue *L,int n)
{QNode *t = (QNode*)malloc(sizeof(QNode));if(!t) exit(0);t->data = n;t->next = NULL;L->rear->next = t;L->rear = t;free(t);return 0;
}/*出队列*/
int out_queue(LinkQueue *L)
{QNode *t;if(L->front==L->rear) return 0;t = L->front->next;L->front->next = t->next;if(t==L->rear) L->rear = L->front;return 1;
}/*广度遍历*/
int BFS_traverse_UDN(adjMatrix *G)
{int i=0,j;LinkQueue *L = (LinkQueue*)malloc(sizeof(LinkQueue));init_queue(L);printf("广度遍历无向图:");visited[i] = 1;printf("%c",G->vert[i]);in_queue(L,i);do{out_queue(L);for(j=0;j<G->vertNum;j++){if(G->adj[i][j]!=0&&visited[j]!=1){visited[j] = 1;printf("->%c",G->vert[j]);in_queue(L,j);}}i++;}while(!empty_queue(L));	free(L);return 0;
}int main()
{adjMatrix *G = (adjMatrix*)malloc(sizeof(adjMatrix));creatUDG(G);BFS_traverse_UDN(G);return 0;
}


http://chatgpt.dhexx.cn/article/TUBMrSvi.shtml

相关文章

C++实现图的深度优先遍历和广度优先遍历

图的深度和广度优先遍历 图的深度优先遍历1、算法思想2、邻接矩阵构造图3、邻接表构造图 图的广度优先遍历1、算法思想2、邻接矩阵构造图 参考 图的深度优先遍历 1、算法思想 &#xff08;1&#xff09;从图中的某个初始点 v 出发&#xff0c;首先访问初始点 v.&#xff08;…

深度优先遍历

1.先序序列为a,b,c,d 的不同二叉树的个数是 &#xff08;14&#xff09; 。 13 14 15 16 f&#xff08;n&#xff09;c(n 2n)/n1 2.在构建哈弗曼树时&#xff0c;要使树的带权路径长度最小&#xff0c;只需要遵循一个原则&#xff0c;那就是&#xff1a;权重越大的结点离树…

图的遍历——深度优先遍历与广度优先遍历

目录 何谓遍历&#xff1f; 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析&#xff1a; 算法的代码实现 测试案例&#xff1a; 测试结果如下&#xff1a; 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 算法的代码实现 队…

图的深度优先遍历和广度优先遍历

本文参考自《大话数据结构》 文章目录 定义图的存储结构邻接矩阵邻接表 图的遍历深度优先遍历邻接矩阵代码邻接表代码 广度优先遍历邻接矩阵邻接表 最小生成树最短路径算法 定义 图(Graph) 是由顶点的有穷非空集合和顶点之间边的集合组成&#xff0c;通常表示为G(V&#xff0…

深度优先遍历和广度优先遍历

深度优先遍历和广度优先遍历 什么是 深度/广度 优先遍历&#xff1f; 深度优先遍历简称DFS&#xff08;Depth First Search&#xff09;&#xff0c;广度优先遍历简称BFS&#xff08;Breadth First Search&#xff09;&#xff0c;它们是遍历图当中所有顶点的两种方式。 这…

图的遍历(深度优先搜索)

1、深度优先搜索遍历过程 图的深度优先搜索(Depth First Search)&#xff0c;和树的先序遍历比较类似。 它的思想&#xff1a;假设初始状态是图中所有顶点均未被访问&#xff0c;则从某个顶点v出发&#xff0c;首先访问该顶点&#xff0c;然后依次从它的各个未被访问的邻接点出…

图的遍历算法之深度优先遍历(DFS)(C++)

图的深度优先遍历思想是&#xff1a; 从图中某结点出发&#xff0c;访问其某一相邻结点&#xff0c;再访问该结点的相邻结点&#xff0c;直至访问完所有的结点。 形象的比喻就是&#xff1a;一条路走到头&#xff0c;回头再走没走过的路。 可见&#xff0c;深度优先遍历是一…

图的深度优先遍历

一 图遍历介绍 所谓图的遍历&#xff0c;即是对结点的访问。一个图有那么多个结点&#xff0c;如何遍历这些结点&#xff0c;需要特定策略&#xff0c;一般有两种访问策略。 1 深度优先遍历 2 广度优先遍历 二 深度优先遍历基本思想 图的深度优先搜索(Depth First Search…

图的遍历 ——深度优先遍历

图的遍历 ——深度优先遍历 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是最常见的图搜索方法之一。 深度优先搜索沿着一条路径一直搜索下去&#xff0c;在无法搜索时&#xff0c;回退到刚刚访问过的节点。深度优先遍历是按照深度优先搜索的方式…

二、图的遍历——深度优先遍历

深度优先遍历&#xff0c;也有称为深度优先搜索&#xff0c;简称为DFS。 深度优先遍历其实就是一个递归的过程&#xff0c;它从图中某个顶点ⅴ出发&#xff0c;访问此顶点&#xff0c;然后从V的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和V有路径相通的顶点…

图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

遍历的定义&#xff1a; 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算&#xff0e; 一:深度优先遍历&#xff08;&#xff24;&#xff26;&#xff…

使用SSM框架上传图片

使用SSM框架上传图片 为了大家方便对照,我上传源码到网盘,有兴趣的自取. ps:其中有一个存储数据的网页,我没删除,可以忽略 链接&#xff1a;https://pan.baidu.com/s/1u24E8mUs4K-raoQgx-ae2A 提取码&#xff1a;java 建数据表 CREATE DATABASE my_resource;USE my_resource…

SSM框架简单介绍

一. SSM框架简介及特征 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可…

SSM框架整合详细教程

目录 1. 什么是SSM&#xff1f; 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM&#xff1f; SSM是对三个框架名字的简写&#xff0c;其中第一个S指的是SpringMVC,第二个S指的是Spring&#xff0c;第三个M指的是M…

SSM框架理解

一、作用&#xff1a; 1、 SSM是spingspringMVCmybatis集成的框架。是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层。 2、使用spring MVC负责请求的转发和视图管理&#xff0c;spring实现业务对象管理…

SSM框架初探

SSM 框架初探 SSM框架简介对框架的理解为什么使用 SSM 框架 SpringSpringMVCMybatis SSM框架简介 SSM框架一种以java语言作为后端搭建基本语言的应用系统搭建框架。是继SSH(strutsspringhibernate)之后&#xff0c;目前较为主流的Java EE企业级框架&#xff0c;适用于搭建各种大…

SSM框架整合

今天来整合一下SSM三大框架~~ 1、创建一个maven项目 比较简单就不赘述了&#xff0c;创建的时候选择webapp骨架。 用骨架创建的项目&#xff0c;在创建完之后要更新一下web.xml 模板目录&#xff1a;“你的Tomcat安装目录\webapps\ROOT\WEB-INF\web.xml” 2、项目整体结构 按…

SSM框架原理

SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理&#xff…

SSM框架总结

一&#xff1a;什么是SSM框架&#xff1f; SSM框架是Spring、SpringMVC和MyBatis框架的总结&#xff0c;是比较标准的MVC模式。 标注的SSM框架有四层&#xff1a;dao&#xff08;mapper&#xff09;层、service层、controller层、domain(entity)层。 使用Spring实现业务对象…

SSM框架详解

SSM框架详解 写在前面&#xff1a;当初整理SSM原理时&#xff0c;参考了网上一些前辈的文章&#xff0c;时间久远已经忘记来源&#xff0c;所以文中原理部分如有侵权请联系我删除。 基于SSM框架的仿天猫商城网站电商后台管理系统 本文视频讲解 文章目录 SSM框架详解 一、项…