分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...

原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次。
在二叉树基础中,介绍了对于树的遍历。树的遍历是指从根节点出发,按照一定的访问规则,依次访问树的每个节点信息。树的遍历过程,根据访问规则的不同主要分为四种遍历方式:
(1)先序遍历
(2)中序遍历
(3)后序遍历
(4)层次遍历
类似的,图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列
图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:
(1)深度优先搜索(DFS,Depth First Search)
(2)广度优先搜索(BFS,Breadth First Search)2 深度优先搜索2.1 算法思想深度优先搜索思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。2.2 算法特点
深度优先搜索是一个递归的过程。首先,选定一个出发点后进行遍历,如果有邻接的未被访问过的节点则继续前进。若不能继续前进,则回退一步再前进,若回退一步仍然不能前进,则连续回退至可以前进的位置为止。重复此过程,直到所有与选定点相通的所有顶点都被遍历。
深度优先搜索是递归过程,带有回退操作,因此需要使用栈存储访问的路径信息。当访问到的当前顶点没有可以前进的邻接顶点时,需要进行出栈操作,将当前位置回退至出栈元素位置。2.3 图解过程2.3.1 无向图深度优先搜索
以图2.3.1.1中所示无向图说明深度优先搜索遍历过程。

8996f538cd88d0aca7543ac2c70b19a2.png


图2.3.1.1
(1)首先选取顶点A为起始点,输出A顶点信息,且将A入栈,并标记A为已访问顶点。
(2)A的邻接顶点有C、D、F,从中任意选取一个顶点前进。这里我们选取C顶点为前进位置顶点。输出C顶点信息,将C入栈,并标记C为已访问顶点。当前位置指向顶点C。
(3)顶点C的邻接顶点有A、D和B,此时A已经标记为已访问顶点,因此不能继续访问。从B或者D中选取一个顶点前进,这里我们选取B顶点为前进位置顶点。输出B顶点信息,将B入栈,标记B顶点为已访问顶点。当前位置指向顶点B。
(4)顶点B的邻接顶点只有C、E,C已被标记,不能继续访问,因此选取E为前进位置顶点,输出E顶点信息,将E入栈,标记E顶点,当前位置指向E。
(5)顶点E的邻接顶点均已被标记,此时无法继续前进,则需要进行回退。将当前位置回退至顶点B,回退的同时将E出栈。
(6)顶点B的邻接顶点也均被标记,需要继续回退,当前位置回退至C,回退同时将B出栈。
(7)顶点C可以前进的顶点位置为D,则输出D顶点信息

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵实现深度优先遍历: 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、付费专栏及课程。

余额充值