首页 > 编程知识 正文

深度优先遍历CSDN,数据结构深度优先遍历算法

时间:2023-05-03 22:09:33 阅读:46387 作者:4037

深度优先遍历,也称作深度优先搜索,缩写为DFS

深度优先遍历从某个顶点出发,访问此顶点,然后从v的未被访问的邻接点触发深度优先便利图,直至所有和v有路径想通的顶点都被访问到。

这样我们一定就访问到所有结点了吗,没有,可能还有的分支我们没有访问到,所以需要回溯(一般情况下都设置一个数组,来记录顶点是否访问到,如果访问到就不执行DFS算法,如果未被访问过就执行DFS算法)

以这张图为例

我们约定,在没有碰到重复顶点的情况下,优先选择右手边

那么按深度优先遍历就是:A B C D E F G H(此时这条线路已经走到尽头,可是还有一个I顶点没有遍历,所以回到G,发现G的邻接点都遍历过了,再回到F,发现F的邻接点也都遍历过了。。。直到D顶点,发现I这个顶点没有遍历,所以把I再遍历,继续回溯,最终回到起点A) I

落实到代码就是

//访问标志的数组。 1表示已访问,0表示未访问的int visted[100]; //相邻表深度优先遍历算法voidadjacencylist :3360 DFS (图形jlist * g,int i ) { EdgeNode *p; visted[i]=1; cout G-adjList[i].data '-- '; p=G-adjList[i].firstedge; while(p ) ) if (! visted[p-adjvex](//递归地DFS(g,p-adjvex ); (} p=p-next; }//遍历相邻表操作voidadjacencylist :3360 DFS traverse (graphadjlist * g )//初始化所有顶点都没有访问过cout (深度快速遍历结果为for(intI=0; i G-numVertexes; I ) { visted[i]=0; }for(intI=0; i G-numVertexes; I ) if (可视[ I ]==0) ) DFS(g,I ); }}完整代码

////Created by烟雨半世殇on 2018/11/21 .//# includeiostreamusingnamespacestd; //访问标志的数组。 1表示已访问,0表示未访问的int visted[100]; //边表节点typedef struct EdgeNode { //顶点对应的下标int adjvex; //指向下一个相邻节点的struct EdgeNode *next; }边缘节点; //顶点表节点typedef struct VertexNode { //顶点数据char data; //边缘标头指针edgeNode *firstedge; } VertexNode,AdjList[100]; //集合typedef struct { AdjList adjList; //顶点数和边数int numVertexes,numEdges; } GraphAdjList; classadjacencylist { public : voidcreatealgraph (graphadjlist * g ); 语音图形(图形jlist * g; void DFS (图形jlist * g,int i ); voiddfstraverse (图形列表* g ); Void测试(; (; voidadjacencylist :3360创建algraph (graphadjlist * g ) { int i,j,k; 边缘节点* e; cout '顶点数和边数' endl; //输入顶点数和边数cin G-numVertexes G-numEdges; //读取顶点信息,制作顶点表for (I=0; i G-numVertexes; I )//顶点信息cin G-adjList[i].data; //使边表为空表的G-adjList[i].firstedge=NULL; //边表(插头法) for ) k=0; k G-numEdges; k ) ({ cout输入边) vi,vj )上的顶点编号) endl; cin i j; e=新边缘节点; e-adjvex=j; e-next=G-adjList[i].firstedge; G-adjList[i].firstedge=e; e=新边缘节点; e-adjvex=i; e-next=g-adj列表[ j ].first edge; G-adjList[j].firstedge=e; } voidadjacencylist :3360 test () { cout 'ALL IS OK.' endl; } voidadjacencylist :3360 show algraph (graphadjlist * g ) for(intI=0; i G-numVertexes; I ) { cout '顶点' I ' : ' g-adj list [ I ].data '-- first edge-- '; edge node * p=新edge node; p=G-adjList[i].firstedge; while(p ) ) { cout p-adjvex '--Next-- '; p=p-next; } cout '--空' endl; } voidadjacencylist :3360 DFS (图形jlist * g,int i ) { EdgeNode *p; visted[i]=1; cout G-adjList[i].data '-- '; p=G-adjList[i].firstedge; while(p ) ) if (! visted[p-adjvex](//递归地DFS(g,p-adjvex ); (} p=p-next; } voidadjacencylist :3360 DFS traverse (graphadjlist * g ) /初始化的所有顶点都没有访问cout (深度优先遍历的结果为) endl; for(intI=0; i G-numVertexes; I ) { visted[i]=0; }for(intI=0; i G-numVertexes; I ) if (可视[ I ]==0) ) DFS(g,I ); } }}int main () { AdjacencyList adjacencyList; graphadjlist * ga=newgraphadjlist; adjacencyList.Test (; Adjacencylist.createalgraph(ga; Adjacencylist.showAlgraph(ga; adjacencylist.DFStraverse(ga; 返回0; }以此图为基准输入

执行结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。