【数据结构】邻接表表示法的图的深度广度优先遍历递归和非递归遍历

来源:互联网 发布:linux下tomcat自启动 编辑:程序博客网 时间:2024/05/19 16:50

图有多种表示方法,在 《无向邻接矩阵表示法的图的遍历》这篇文章中,讲了邻接矩阵表示法的遍历,这篇文章中将讨论邻接表表示法的图的遍历。邻接矩阵表示法在稀疏图(边少的图中)中比邻接矩阵表示法节省内存空间。不管以何种方式来表示,他们的遍历顺序是没有改变的。继续贴上图,方便我们理解。

上面的图可以用下面的邻接表表示。


左边的灰色区域表示各个顶点,我们可以用数组来表示,右边的黄色区域代表着各个顶点与其他顶点的关系。

邻接表表示法深度优先遍历和广度优先遍历代码如下:

package 邻接表图的遍历;import java.util.*;public class Main {/** * @author zyw *无向邻接表表示法的图的遍历 */private static class Vertex{    String data;//顶点的数据int idx;//顶点的索引int[] vertexs;//存储与该顶点所连的顶点}//图的顶点的定义,赋值就不要修改他的字段的值private static Vertex[] list=new Vertex[6];/** * 无向邻接表表示法图的深度优先遍历 * @param vertex 开始遍历的顶点 */private static void DFS(Vertex vertex) {Stack<Vertex> stack=new Stack<Vertex>();//深度优先遍历用栈存储Vertex tempVertex,firstVertex = null;boolean[] isVisit=new boolean[6];//用于标记每个顶点是否被访问过Arrays.fill(isVisit,false);stack.push(vertex);boolean isFirst=false;while(!stack.empty()){tempVertex=stack.pop();//如果没有被访问过才访问if(!isVisit[tempVertex.idx]){isVisit[tempVertex.idx]=true;System.out.print(tempVertex.data+" ");}isFirst=true;for(int i=0;i<tempVertex.vertexs.length;i++){if(!isVisit[list[tempVertex.idx].vertexs[i]]){if(isFirst){//记录第一个节点firstVertex=list[list[tempVertex.idx].vertexs[i]];isFirst=false;}else{//表中非第一个节点入栈//请注意这个长长的数据访问stack.push(list[list[tempVertex.idx].vertexs[i]]);}}}//第一个节点最后入栈if(!isVisit[firstVertex.idx]){stack.push(firstVertex);}}}/** * 无向邻接表表示法图的广度优先遍历 * @param vertex 开始遍历的顶点 */private static void BFS(Vertex vertex) {Queue<Vertex> queue=new LinkedList<Vertex>();//广度优先遍历用队列存储boolean[] isVisit=new boolean[6];//用于标记每个顶点是否被访问过Arrays.fill(isVisit,false);Vertex tempVertex;queue.offer(vertex);while(!queue.isEmpty()){tempVertex=queue.poll();if(!isVisit[tempVertex.idx]){isVisit[tempVertex.idx]=true;    System.out.print(tempVertex.data+" ");}for (int i = 0; i < list[tempVertex.idx].vertexs.length; i++) {if(!isVisit[list[tempVertex.idx].vertexs[i]]){//请注意这个长长的数据访问queue.offer(list[list[tempVertex.idx].vertexs[i]]);}}}}/** * 主函数 * @param args */public static void main(String[] args) {// TODO Auto-generated method stubcreate();System.out.println("无向邻接表表示的图的深度优先遍历");DFS(list[0]);System.out.println("\n无向邻接表表示的图的广度优先遍历");BFS(list[0]);}/** * 构造无向邻接表表示法图 */private static void create() {// TODO Auto-generated method stubfor (int i = 0; i < list.length; i++) {list[i]=new Vertex();list[i].idx=i;}list[0].vertexs=new int[]{1,2,3};list[0].data="A";list[1].vertexs=new int[]{0,3};list[1].data="B";list[2].vertexs=new int[]{0,3,4};list[2].data="C";list[3].vertexs=new int[]{0,1,2,5};list[3].data="D";list[4].vertexs=new int[]{2,3};list[4].data="E";list[5].vertexs=new int[]{3,4};list[5].data="F";}}


0 0
原创粉丝点击