遍历流程
以无向图为例
邻接矩阵,该邻接矩阵纵坐标(i)为访问的起点,而横坐标(j)代表访问终点
(1)起点为2,先将Visited数组(Bool)当中,表示为2的结点,标记为1,代表已经访问
(2)查看纵坐标i=2的行,其中横坐标j=1的列,发现邻接矩阵对应值为1,说明点2的邻接点1,还没有被访问,于是我们访问点1
(4)访问点1,Visited数组(Bool)当中,表示为2的结点,标记为1,再跳转到i=1的行,横坐标i=2,但点2已经被访问,而i=3,点3还没有被访问
(4)访问点3,同理,重复步骤(邻接矩阵中,值为1,但没有被访问的点)
(5)访问点5 ,但i=5的行中,j=2,3(点2,点3)均被访问过,回退到i=3的行
(6)i=3的行,也全访问了,回退到i=1的行,发现j=4还没有被访问过
(7)访问点4
(8)访问点6,访问完i=6的行,发现全访问过了,回退到点4,点1,点2的行
(9)回到点2的行后,发现全访问了,深度优先遍历结束
对于上图中AMGraph G(图的邻接矩阵存储结构)定义如下:
//顶点(结点)数目的最大值
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型(这里指邻接矩阵的权值的数据类型,如0,1)
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点表,结点的值,如结点值为1
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,描述边关系的表
int vexnum,arcnum; //图当前顶点数和边(弧)数
}AMGragh
参考链接
https://www.bilibili.com/video/BV1qt411171s?from=search&seid=3497279112733240296