图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历
基本思想:首先访问出发点 v , 并将其标记已访问过;然后选取与 v 点邻接的任意一个顶点 w ,并访问它;再选取与 w 邻接的未被访问的任一顶点并访问,以此重复进行。当一个顶点的所有邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他未被访问过的邻接顶点时,则从这些顶点中选取一个并重复上述过程,直到图中所有的顶点都被访问过为止。
- 图的邻接矩阵存储定义
typedef struct{
int no; //顶点编号
char info; //顶点其他信息,没有可不写
}VertexType; //顶点类型
typedef struct{ //图的定义
int edges[maxSize][maxSize];
int n,e; //顶点数,边数
VertexType vex[maxSize]; //存放图的结点信息
}MGraph;
- 图的邻接表存储定义
邻接表就是对图中的每一个顶点 i 建立一个单链表,每个单链表的第一个结点存放有关顶点的相关信息,把这一结点看作链表的表头,其余结点存放有关边的信息。因此,邻接表是由单链表的表头形成的顶点表和单链表其余结点形成的边表两部分组成。一般顶点表存放顶点信息和指向第一个边结点的指针,边表结点存放与当前顶点相邻接顶点的序号和指向下一个边结点的指针。
typedef struct ArcNode{
int adjvex; //该边所指向的结点的位置
struct ArcNode *nextarc; //指向下一条边的指针
int info; //该边的相关信息(如权值),没有可不写
}ArcNode;
typedef struct{
char data; //顶点信息
ArcNode *firstarc; //指向第一条边的指针
}VNode;
typedef struct{
VNode adjlist[maxSize]; //邻接表
int n,e; //顶点数,边数
}AGraph;
- 图的邻接多重表存储定义
…
算法执行过程:任取一个顶点,访问,然后检查这个顶点的所有邻接顶点,递归访问其中未被访问的顶点。
以邻接表为存储结构的图的深度优先遍历搜索:
int visit[maxSize];
/*v 是起点编号,visit[] 是一个全局数组,作为顶点的访问标记,初始时所有元素为0,
表示所有顶点都为被访问。因图中可能存在回路,当前经过的顶点将来还可能再次经过,
所以要对每个顶点进行标记*/
void DFS(AGraph *G, int v){
ArcNode *p;
visit[v] = 1; //置已访问标记
Visit(v); //函数Visit()代表访问顶点v的一系列操作
p=G->adjlist[v].firstarc; //p指向顶点v的第一条边
while(p!=NULL){
if(visit[p->adjvex] == 0){
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}
与图的DFS算法对照,写出二叉树的先序遍历:
void preorder(bt node *p){
if(p!=NULL){
Visit(p);
preorder(p->lchild);
preorder(p->rchlid);
}
}