分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_图的遍历-深度优先和广度优先...

00e94c35789d8cc2e08bdfce9568a4c6.png

0.深度优先遍历

9d4b4837ddf12dee5ba86496ae0f1234.png

图的遍历:就是依次访问所有的结点,且不能重复访问某个结点,且要避免死循环,所以应该把访问过的结点加上标记。

1.邻接矩阵深度优先遍历

所以上图中,以结点的右手原则遍历得到以下结果:

524b05ac5d5ad16ad73bccd2d4da649a.png
右手原则遍历

但是还没有访问到所有的结点,所以现在应该原路返回

如果遇到还没有访问过的结点,则继续访问,比如I结点:

341cbc8af3b18867d42277f3d802ca56.png
遇到I结点还没有访问过,就访问I结点

在邻接矩阵实现深度优先遍历

810b0be37af4e9d8c1a2f8252881fcd2.png
顶点数组

其邻接矩阵为:

f4f80ca6574f2a260ee03008d4df9cf1.png

邻接矩阵深度优先遍历代码实现思路:

  1. 将图的顶点和边信息输入到图结构中;
  2. 创建一个visited数组,用来标识顶点是否已经被遍历过了;
  3. 初始化visited数组,将数组中元素置为false;
  4. 选择顶点开始遍历;【注意非连通图的情况】
  5. 进入递归;打印i对应的顶点信息,并将该顶点标识为已经遍历
  6. 循环遍历边表,判断当前arc[i][j]是否等于1,并且当前该顶点没有被遍历过,则继续递归DFS。

代码实现

1.先构建邻接矩阵结构

#define OK 1

2. 构建一个邻接矩阵

构建一个邻接矩阵*/

3.DFS遍历

/*4.2 DFS遍历*/

使用并打印:

printf

8fd318781a65b14e6270efb4d583a82f.png

2.邻接表深度优先遍历

33b07fa3df76bceec3c25990cfcccf23.png

用邻接表来存储上面的图:

61633e9a5b36ff6b6c6637b6b78c60e0.png
邻接表来存储图

从A开始遍历上图:

4bf4b82173de125aff40ffc85dfd2190.png
从A开始遍历的顺序

最后得到的结果为:AFGHEDICB

邻接表深度优先遍历代码实现思路:

  1. 利用邻接矩阵将信息存储到邻接表中
  2. 创建一个visited数组,用来标识顶点是否已经被遍历过了;
  3. 初始化visited数组,将数组中元素置为false;
  4. 选择顶点开始遍历;【注意非连通图的情况】
  5. 进入递归;打印i对应的顶点信息,并将该顶点标识为已经遍历
  6. 循环遍历边表,判断当前arc[i][j]是否等于1,并且当前该顶点没有被遍历过,则继续递归DFS。

代码实现:

0.构建数据结构

#define OK 1

1.构建一个邻接矩阵

void 

2.利用邻接矩阵构建邻接表

/*利用邻接矩阵构建邻接表*/

3.邻接表的深度优先递归算法

Boolean 

使用并打印

printf

893f462721a143eff6c6330b388902a1.png
邻接表存储图

3.广度优先遍历

广度优先遍历和树的层序遍历类似。

e5851162008207ea90ff6ac987d06914.png
原始图

上图经过变形

743497a1b22e82c9c5454950d8dac11f.png
变形后

特点:

  1. 把根节点放到队列的末尾;
  2. 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们方法队列的末尾,并把这个元素记为下一级元素的前驱;
  3. 找到所要找到元素的结束程序;
  4. 如果遍历整个树还没有找到,结束遍历。

1246bdb940a45738a9cdcfc245d074c2.png
用队列进行广度优先遍历

用邻接矩阵进行广度优先遍历

0.邻接矩阵的数据结构

#define OK 1

1.构建一个邻接矩阵

/*构建一个邻接矩阵*/

2.需要用到的队列结构与相关功能函数

/* 循环队列的顺序存储结构 */

3.邻接矩阵广度优先遍历

/*邻接矩阵广度优先遍历-代码实现*/

使用并打印

printf

9b175f8dc8019fc7352d74a5a2b349a0.png

用邻接表进行广度优先遍历

0.构建邻接表数据结构

#define OK 1

1.构建一个邻接矩阵

/*构建一个邻接矩阵*/

2.需要用到的队列结构与相关功能函数

/* 循环队列的顺序存储结构 */

3.邻接表广度优先遍历

/*邻接表广度优先遍历*/

使用并打印

printf

723aeca1e9f24fa70afdc81f8929a9e1.png
邻接表的广度优先遍历
邻接矩阵实现深度优先遍历: 1. 从起点开始,将起点标记为已访问 2. 从起点开始,遍历起点的所有未访问的邻结点 3. 对于遍历到的邻结点,重复步骤1和2,直到遍历完整张 邻接矩阵实现广度优先遍历: 1. 从起点开始,将起点入队 2. 当队列不为空时,取出队头元素 3. 将队头元素标记为已访问 4. 将队头元素的所有未访问的邻结点入队 5. 重复步骤2-4直到遍历完整张 邻接表实现深度优先遍历: 1. 从起点开始,将起点标记为已访问 2. 从起点开始,遍历起点的所有未访问的邻结点 3. 对于遍历到的邻结点,重复步骤1和2,直到遍历完整张 邻接表实现广度优先遍历: 1. 从起点开始,将起点入队 2. 当队列不为空时,取出队头元素 3. 将队头元素标记为已访问 4. 将队头元素的所有未访问的邻结点入队 5. 重复步邻接矩阵实现深度优先遍历: 1. 从第一个顶点开始,标记该顶点已遍历 2. 遍历该顶点的所有邻接顶点,如果该邻接顶点未被遍历,则递归遍历 3. 遍历完所有邻接顶点后,返回上一层递归 邻接矩阵实现广度优先遍历: 1. 从第一个顶点开始,标记该顶点已遍历 2. 将该顶点的所有邻接顶点加入队列 3. 从队列中取出一个顶点,如果该顶点未被遍历,则标记该顶点已遍历,并将该顶点的所有邻接顶点加入队列 4. 重复步骤3直到队列为空 邻接表实现深度优先遍历: 1. 从第一个顶点开始,标记该顶点已遍历 2. 遍历该顶点的所有邻接顶点,如果该邻接顶点未被遍历,则递归遍历 3. 遍历完所有邻接顶点后,返回上一层递归 邻接表实现广度优先遍历: 1. 从第一个顶点开始,标记该顶点已遍历 2. 将该顶点的所有邻接对于邻接矩阵邻接表实现深度优先遍历,都是首先从起点开始遍历,标记起点为已访问,然后遍历起点的所有未访问的邻结点,对于遍历到的邻结点,重复步骤1和2,直到遍历完整张。对于邻接矩阵邻接表实现广度优先遍历,都是首先从起点开始遍历,将起点入队,当队列不为空时,取出队头元素,标记为已访问,将队头元素的所有未访问的邻结点入队,重复步骤2-4直到遍历完整张.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值