【数据结构与算法学习】图的深度优先遍历(DFS算法)

一、什么是图的遍历

图的遍历,指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上。
在这里插入图片描述

二、深度优先遍历(DFS)的基本思想

深度优先遍历(death first search)即DFS,从初始结点出发,初始结点可能会有多个邻接结点,访问完初始结点后,将其标记为已访问,再任意选择一个未被访问的邻接结点,然后再以这个被选择的邻接结点作为初始结点,再任意选择它的下一个未被访问邻接结点,以此类推。大概可以先理解为:每次都在访问完当前结点后首先访问的是未被访问的邻接结点,并任意选择一个邻接结点视为初始结点,继续遍历下去。

在这里插入图片描述
想必在这时候,很多小伙伴已经发现问题了。当下一个结点的全部邻接结点都已经被访问过了,该怎么继续遍历下去呢?🤫哈哈,先不用着急!继续往下看吧!

三、深度优先遍历(DFS)的步骤详解

通常dfs选择未被遍历的邻接结点是任意的,在这里的选择原则是利用邻接矩阵按照结点的顺序[A,B,C,D,E]选择邻接结点。

算法步骤:

  1. 访问初始结点v,并标记结点v为已访问
  2. 查找结点v的第一个邻接结点w
  3. 若w存在,且w未被访问则继续执行4;若w存在,且w被访问则继续执行5;如果w不存在,则返回第1步,将从v的下一个邻接结点继续🤫
  4. 对w进行深度优先遍历递归(即将w视为初始结点v,进行123的步骤)
  5. 查找结点v的邻接结点w的下一个邻接结点(即寻找v的第二个邻接结点,第一个已经被访问了),转到步骤3
四、深度优先遍历(DFS)的代码实现

在这里插入图片描述
(在图的遍历过程中,图是以邻接矩阵的形式呈现的,所以在邻接矩阵上进行遍历
遍历过程的详解:

  1. 访问初始结点A,标记A为已访问 isVisited[0] = true视线放在邻接矩阵的第一行,A存在邻接结点,A的第一个邻接结点是B,显然B是没有被遍历的,B为第一个邻接结点,B成为初始结点。
  2. 访问初始结点B,标记B为已访问 isVisited[1] = true视线放在邻接矩阵的第二行,B存在邻接结点,B的第一个邻接结点是A,由1知A是已被遍历的;退回到B,继续判断它的第二个邻接结点,B的第二个邻接结点是D,显然D是没有被遍历的,D成为初始结点。
  3. 访问初始结点D,标记D为已访问 isVisited[3] = true视线放在邻接矩阵的第四行,D存在邻接结点,D的第一个邻接结点是A,由1知A是已被遍历的;退回到D,继续判断它的第二个邻接结点,D的第二个邻接结点是B,由2知B是已被遍历的;退回到D,继续判断它的第三个邻接结点,D的第三个邻接结点是C,显然C是没有被遍历的,C成为初始结点。
  4. 访问初始结点C,标记C为已访问 isVisited[2] = true视线放在邻接矩阵的第三行,C存在邻接结点,D的第一邻接结点是A,由1知A是已被遍历的;退回到C,继续判断它的第二邻接结点,C的第二个邻接结点是D,由3知D是已被遍历的;退回到C,继续判断它的第三个邻接结点,C的第三个邻接结点时E,显然E是没有被遍历的,E成为初始结点。
  5. 访问初始结点E,标记E为已访问 isVisited[4] = true视线放在邻接矩阵的第五行,E存在邻接结点,E的第一个邻接结点是C,由4知C是已被遍历的;退回到E,继续判断它的第二个邻接结点,E的第二个邻接结点是D,由3知D是已被遍历的;退回到E,发现E的邻接结点已经全被访问过了,然后就退回C-D-B-A继续寻找是否还有未遍历的邻接结点(回溯)。
package com.datou.graph;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author datou
 * @data 2020/8/11 - 18:01
 * @target 图的表示
 * 要求:输入结点及结点数,各个边的连接情况,输出邻接矩阵
 */
public class Graph {
   
    //结点
    private ArrayList<String> nodeList;
    //邻接矩阵
    private int[][
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值