首页 > 代码库 > 学习笔记:图的DFS和BFS的两种搜索办法

学习笔记:图的DFS和BFS的两种搜索办法

 

 

在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷。

 

BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处。

在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队。

同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的。

 

 1 void TraversalGraph_BFS(LGraph Graph,Vertex vertex){ 2     Visit(vertex); 3     VISIT[vertex]=1; 4     enqueue(queue,vertex); 5     while(!isEmpty(queue)){ 6         DelQueue(queue); 7         for(w=Graph->G[vertex].FirstNode;w;w=w->Next){ 8             if(!Visit[w]){ 9                 Visit[w];10                 Visit[w->vertex]=1;11                 enqueue(queue,w);12             }13         }14     }15 }

 

DFS又被称作深度优先算法,与BFS不同的是,DFS会首先遍历其儿子节点,这样有点类似在树结构中的前序遍历。

在理解方面相比比较容易,DFS采用了递归的思路,在用链表实现DFS时,思路是当遇到一个没有遍历的节点,则进入该节点,然后同理往下递归,直到某个节点无法在继续则返回。

1 void TraversalGraph_DFS(LGraph Graph,Vertex vertex,void(*Visit)(Vertex)){2     PtrToAdjVNode W;3     Visit(vertex);4     Visit[vertex]=1;5     for(w=Graph->G[vertex].FirstNode;w;w=w->Next){6         if(!Visit[w->vertex])7             TraversalGraph_DFS(Graph,w->Vertex)8     }9 }

 

下面是程序结构体的前置定义

 1 #include<stdio.h> 2 #include<stdlib.h> 3  4 typedef struct Enode *PtrToEnode; 5 typedef int Vertex; 6 typedef int WeightType; 7 typedef DataType Data; 8 struct Enode{ 9     Vertex v1,v2;10     WeightType Weight;11 };12 typedef PtrToEnode Edge;13 14 typedef struct AdjVNode *PtrToAdjVNode;15 struct AdjVNode{16     Vertex vertex;17     WeightType Weight;18     PtrToAdjVNode Next;19 };20 21 typedef struct HeadNode *PtrToHead;22 struct HeadNode{23     PtrToAdjVNode FirstNode;24     DataType Data;25 }HeadNode[Max];26 27 typedef struct Graph *PtrToGNode;28 struct Graph{29     int Ne;30     int Nv;31     HeadNode G;32 };33 typedef *PtrToGNode LGraph;34 35 LGraph creatGraph(int MaxNumb){36     LGraph Graph;37     Graph=(LGraph)malloc(sizeof(struct Graph));38     Graph->Ne=0;39     Graph->Nv=MaxNumb;40     for(i=0;i<Graph->Nv;i++){41         Graph->G[i].FirstNode=NULL;42     }43     return(Graph);44 }45 46 void Insert(LGraph Graph,Edge E){47     AdjVNode NewNode;48     NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode))49     NewNode->Weight=E->W;50     NewNode->vertex=E->v151     Graph->G[E->v2].Next=NewNode->Next;52     Graph->G[E->v2].Next=NewNode;53 }54 55 void Visit(LGraph Graph){56     printf("Now VISIT %d",V);57 }

 

学习笔记:图的DFS和BFS的两种搜索办法