对“深度优先遍历”的理解

深度优先遍历

1 连通图深度优先遍

1)      从图中的某一个顶点V出发,访问此顶点,然后从和V相连但是没有被访问过的顶点出发,深度先遍历图,直到将和V连通的所有顶点被访问完为止

2 非连通图深度优先遍历

1)      从图中的某一个顶点V出发,访问此顶点,然后从和V相连但是没有被访问过的顶点出发,深度先遍历图,直到将和V连通的所有顶点被访问完为止

2)      若此时图中还有顶点未被访问,则任选其中的一个顶点出发,重复1)的步骤,直到图中所有的顶点被访问完

3 深度优先搜索比喻:

    如果在家里找东西,有四个卧室,深度优先就是,将一个卧室彻彻底底的找一遍,然后再找另外的一个卧室,以此下去

4 代码解析

1)      邻接矩阵存储结构

typedefint Boolean;

Boolean visited[Max];                 //记录顶点是否被访问过

 

void DFS(MGraph G,inti)

{

int j;

visited[i] = TRUE;             //首先,将顶点标识为“已访问”

cout <<G.vexs[i] << endl;      //输出顶点信息也可以是其他的操作 比如比较

for(j = 0; j <G.numVertex; j++)

{

if(G.arc[i][j] == 1&& !visited[j])   //当顶点j 与 顶点i 有连通时,并且没有被访问

{

DFS(G,j);    //递归深度遍历顶点j的下一个连通并且没有被访问过的顶点

}

}

}

 

voidDFSTraverse(MGraph G)

{

int i;

for(i = 0; i <G.numVertex; i++)     //初始化visited数组,所有顶点都是未访问过的

{

visited[i]= FALSE;

}

for(i = 0; i <numVertex; i++)         //开始深度搜索图中所有的顶点

{

if(!visited[i])       //如果顶点没有被访问,则访问,否则不访问

{

DFS(G,i);       //将图的结构体指针、当前顶点下标传进去

}

}

}

2)      邻接表存储结构

void DFS(GrapgAglistG,int i)

{

int j;

EdgeNode *p;          //指向下一条边的指针

visited[i] = true;

cout <<G->adjust[i].data;

p =G->adjust[i].firstedge;      //给p赋值,顶点i 的下一条边

/*   因为邻接表中的所有边都是直接直接通过指针连接起来的,所有不需要用遍历的方式,而是判断当前顶点的下一条边是否存在

for(j = 0; j < G.numVertex; j++)

{

if(!visited[i]&& p==G->adjust[j].firstedge)

{

DFS(G,j);

}

}*/

//因为邻接表中的所有边都是直接直接通过指针连接起来的,所有不需要用遍历的方式,而是判断当前顶点的下一条边是否存在

while(p)

{

if(!visited[p->adjvex])

{

DFS(G,p->adjvex);

}

p = p->next;

}

}

 

voidDFSTraverse(GrapgAglist G)

{

int j;

for(j = 0; j <G.numVertex; j++)

{

visited[j] = false;

}

for(j = 0; j <G.numVertex; j++)

{

if(!visited[j])

{

DFS(G,j);

}

}

}

5 注意点:

1)      存储深度遍历信息的结构:

a)      visited[Max]数组,存储顶点是否被访问的信息,TRUE  FALSE

b)      G 图结构体指针,其中有图的边、顶点个数,邻接矩阵,边的信息

c)       i 深度遍历的起点

2)      判断是否遍历的条件:

a)      是否已经被访问过

b)      是否和当前顶点连通

3)      信息的变化:一旦确定可以访问,转到DFS函数中,要将顶点标记为已访问的

部分代码摘抄自《大话数据结构》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值