深度优先遍历

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。

广度优先遍历·

广度优先遍历图是以顶点v为起始点,由近至远,依次访问和v有路径相通而且路径长度为1,2,……的顶点。为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,需设置队列存储访问的顶点。

代码实现

邻接矩阵结构的遍历

//邻接表的深度优先遍历和广度优先遍历
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef int Status;  /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */#define MAXSIZE 9 /* 存储空间初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9
#define INFINITY 65535typedef struct
{VertexType vexs[MAXVEX]; /* 顶点表 */EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */int numVertexes, numEdges; /* 图中当前的顶点数和边数 */
}MGraph;/* 用到的队列结构与函数********************************** *//* 循环队列的顺序存储结构 */
typedef struct
{int data[MAXSIZE];int front;       /* 头指针 */int rear;      /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}Queue;/* 初始化一个空队列Q */
Status InitQueue(Queue* Q)
{Q->front = 0;Q->rear = 0;return  OK;
}/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(Queue Q)
{if (Q.front == Q.rear) /* 队列空的标志 */return TRUE;elsereturn FALSE;
}/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(Queue* Q, int e)
{if ((Q->rear + 1) % MAXSIZE == Q->front)  /* 队列满的判断 */return ERROR;Q->data[Q->rear] = e;           /* 将元素e赋值给队尾 */Q->rear = (Q->rear + 1) % MAXSIZE;/* rear指针向后移一位置, *//* 若到最后则转到数组头部 */return  OK;
}/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status DeQueue(Queue* Q, int* e)
{if (Q->front == Q->rear)           /* 队列空的判断 */return ERROR;*e = Q->data[Q->front];             /* 将队头元素赋值给e */Q->front = (Q->front + 1) % MAXSIZE; /* front指针向后移一位置, *//* 若到最后则转到数组头部 */return  OK;
}
/* ****************************************************** */void CreateMGraph(MGraph* G)
{int i, j;G->numEdges = 15;G->numVertexes = 9;/* 读入顶点信息,建立顶点表 */G->vexs[0] = 'A';G->vexs[1] = 'B';G->vexs[2] = 'C';G->vexs[3] = 'D';G->vexs[4] = 'E';G->vexs[5] = 'F';G->vexs[6] = 'G';G->vexs[7] = 'H';G->vexs[8] = 'I';for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{for (j = 0; j < G->numVertexes; j++){G->arc[i][j] = 0;}}G->arc[0][1] = 1;G->arc[0][5] = 1;G->arc[1][2] = 1;G->arc[1][8] = 1;G->arc[1][6] = 1;G->arc[2][3] = 1;G->arc[2][8] = 1;G->arc[3][4] = 1;G->arc[3][7] = 1;G->arc[3][6] = 1;G->arc[3][8] = 1;G->arc[4][5] = 1;G->arc[4][7] = 1;G->arc[5][6] = 1;G->arc[6][7] = 1;for (i = 0; i < G->numVertexes; i++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}Boolean visited[MAXVEX]; /* 访问标志的数组 *///邻接矩阵深度优先递归算法
void DFS(MGraph G, int i)
{int j;visited[i] = TRUE;printf("%c", G.vexs[i]);//打印顶点for (int j = 0; j < G.numVertexes; j++){if (G.arc[i][j] == 1 && !visited[j])DFS(G, j);}
}
//邻接矩阵的深度遍历操作
void DFSTraverse(MGraph G)
{int i;for (int i = 0; i < G.numVertexes; i++){visited[i] = FALSE;}for (int i = 0; i < G.numVertexes; i++){if (!visited[i])/* 对未访问过的顶点调用DFS,若是连通图,只会执行一次 */ DFS(G, i);}
}//邻接矩阵的广度遍历算法.非递归方法 ,栈存储法
void BFSTraverse(MGraph G)
{Queue Q;for (int i = 0; i < G.numVertexes; i++){visited[i] = FALSE;}InitQueue(&Q);      /* 初始化一辅助用的队列 */for (int i = 0; i < G.numVertexes; i++){if (!visited[i]){visited[i] = TRUE;printf("%c", G.vexs[i]);EnQueue(&Q, i);while (!QueueEmpty(Q)){DeQueue(&Q, &i);for (int j = 0; j < G.numVertexes; j++){if (G.arc[i][j] == 1 && !visited[j]){visited[j] = TRUE;printf("%c", G.vexs[j]);EnQueue(&Q, j);}}}}}
}
int main(void)
{MGraph G;CreateMGraph(&G);printf("\n深度遍历:");DFSTraverse(G);printf("\n广度遍历:");BFSTraverse(G);return 0;
}

邻接表结构的遍历

在这里插入代码片

大话数据结构 17:图的深度优先遍历和广度优先遍历相关推荐

  1. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  2. 大话数据结构笔记-图

    大话数据结构笔记-图 定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为 G(V,E), 其中 G表示一个图, V是图G中的顶点的集合, E是图G中边的集合. 顶点就是图中 ...

  3. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  4. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  5. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

  6. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  7. 数据结构之图的遍历:广度优先遍历(BFS)

    图的遍历:广度优先遍历 思维导图: 广度优先遍历的原理: 广度优先遍历的代码实现: 广度优先遍历的性能分析: 无权图单源最短路径问题: 广度优先生成树: 思维导图: 广度优先遍历的原理: 类似与树的层 ...

  8. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  9. 多级树的深度优先遍历与广度优先遍历(Java实现)

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

最新文章

  1. Android ListView headerDividers 分割线显示隐藏问题
  2. java 万年历_非常实用的java万年历制作方法
  3. 深入理解Memory Order
  4. java中常见数据库字段类型与java.sql.Types的对应
  5. activity调用fragment的方法_Fragment 的现在以及未来
  6. 字符串是单一字符的无序组合吗_Python中拼接字符串的多种方法, 你想了解吗?...
  7. Windows 2003中如何启动IIS6的GZIP压缩网页传输(补充)
  8. 怎么下载计算机考试准考证
  9. 京东质检报告要求和检测项目-京东质检报告怎么弄
  10. win10电脑IIS服务器配置ASP环境
  11. Android10 系统接口 设置屏幕亮度
  12. Coursera | 免费上Coursera-助学金申请流程
  13. web(Response、ServletContext)
  14. 微信连wifi正式全量对外开放申请 升级智能服务
  15. IDEA打包普通web项目
  16. musicbee歌词_MusicBee是快速而强大的音乐管理器
  17. DP1332E NFC刷卡芯片内置mcu
  18. 五种前端布局之float布局
  19. Axure RP9 实现单个元件无限旋转
  20. 重磅!科银资本携手韩国社交巨头Kakao共建Klaytn生态

热门文章

  1. CSS3 border-image的使用方法
  2. 网络编程之---广播和IP多播
  3. XCTF-MISC-新手区-掀桌子
  4. Python3.7模块之re
  5. apue对java_[apue] 一个快速确定新系统上各类限制值的工具
  6. ZooKeeper入门(三)zookeeper的Watcher机制
  7. Linux云服务器安装Tomcat
  8. 浏览器窗口控制---使用localStorage
  9. 勒索病毒GANDCRAB新变种GANDCRAB V5.2新变种来袭 你中招了吗?
  10. This dependency was not found: * !!vue-style-loader!css-loader?……