图的深度优先搜索遍历类似于树的先根遍历,是树先根遍历的推广。
算法描述:
从图中的某节点v开始访问,访问他的任意一个邻结点w1;再从w1出发,访问与w1邻接但是没有被访问过的结点w2;然后再从w2出发,进行类似的访问,。。。如此进行下去,直至所以的邻接结点都被访问过位置,接着,退回一步,退回到前一次刚访问过的结点,看是否还有其他没有被访问的邻接结点。如果有,则访问此结点,只后再从此结点出发,进行与前述类似的访问。重复上述过程,直到连通图中所以结点都被访问过为止。遍历的过程是一个递归的过程。
如上图的深度优先搜索遍历的整个过程描述如下:假定v1是出发点,首先访问v1.因v1有两个邻接点v2、v3均未被访问过,选择访问节点v2,再找v2的未被访问过的邻接点v4、v5,选择访问结点v4.重复上述搜索过程,依次访问结点v8、v5.v5被访问过,由于与v5相连的顶点均被访问过,搜索退回到v8,v8的邻接点v4、v5也被访问过;同理依次退回结点v4、v2,最后退回到结点v1.这时选择结点v1的未被访问过的邻接点v3,继续搜索,依次访问结点v3、v6、v7从而遍历途中全部结点。
算法实现:
//对图进行深度优先遍历
public Interator DFSTraverse(Vertex v){
LinkedList traverseSeq = new LinkedListListDLNode();
resetVexStatus();//重置结点状态
DFS(v,traverseSeq);//从v点出发深度优先遍历搜索
Iterator it = getVertex();//从图中未曾访问的其他结点出发重新搜索
for(it.first;!it.isDone;it.next()){
Vertex u = (Vertex)it.currentItem();
If(!u.isVisited())
DFS(u,traverseSeq);
}
return traverseSeq.elements();
}
//深度优先的递归算法
private void DFS(Vertex v,LinkedList list){
v.setToVisited();
list.insetLast(v);
Iterator it = adjVertexs(v);//取得结点v的所有邻接点
for(it.first();!it.isDone();it.next()){
Vertex u = (Vertex)it.currentItem();
If(!u.isVisited()){
DFS(u,list);
}
}
}
深度优先搜索算法在搜索过程中不考虑各个边的开销,只考虑路径的选择,基本思路是:站在一个连通图的的一个节点上,然后尽可能的沿着一条边深入,当遇到死角时回溯,然后继续搜索,直到搜索到目的节点为止,深度优先一般使用栈结构实现。