代码是根据矩阵来实现深度优先遍历的
邻接结点就是按照vertex中的顺序来一个一个来找的
if(edges[i][j]>0&&!isVisited[j]) {
return j;
}
就很好的说明了 如果没找到就return -1 回到dfs(i)这一层
再return回到dfs()这一层 ,i++ 继续下一轮循环
import java.util.ArrayList;
import java.util.Arrays;class Graph{public ArrayList<String> vertex;//存储顶点集合public int[][] edges;//邻接矩阵public int numOfEdge;//边的个数public boolean[] isVisited;//辅助遍历工具,用来判断一个结点是否被访问过(注意,其实是一个数组)//构造器public Graph(int n) {//初始化矩阵和vertexvertex=new ArrayList<String>(n);edges=new int[n][n];numOfEdge=0;}//深度优先遍历图public void dfs() {//对每一个结点都进行深度优先遍历isVisited=new boolean[vertex.size()];//初始化辅助工具,初始均为未被访问for(int i=0;i<vertex.size();i++) {if(isVisited[i]) {//被访问就跳过continue;}else {dfs(i);//如果没被访问过就递归 调用的下面的那个带参数的dfs方法}}}private void dfs(int i) {//对结点i进行深度优先遍历System.out.print(getValueOfVertex(i)+"---");isVisited[i]=true;int n=getFirst(i);//查找i的邻接结点if(n!=-1) {//找到了dfs(n);}else {return;}}/*** *下面就是根据给定结点的下标得到下一个邻接结点下标的方法* @param i 给定结点的下标* (就是vertex中的下标,也就是矩阵中的位置下标,因为其实是参考矩阵来深度优先遍历的)* @return 返回结点i的第一个且没有被访问过的邻接结点,没有返回-1*/private int getFirst(int i) {for(int j=0;j<vertex.size();j++) {if(edges[i][j]>0&&!isVisited[j]) {return j;}}return -1;}/*以下都是图的基本操作*///添加结点public void add(String str) {vertex.add(str);}//添加边public void addEdges(int a,int b,int value) {edges[a][b]=value;edges[b][a]=value;numOfEdge++;}//返回结点的个数public int getNumOfVertex() {return vertex.size();}//根据结点返回权值public int getValue(int a,int b) {return edges[a][b];}//显示图对应的矩阵public void show() {for(int[] arr:edges) {System.out.println(Arrays.toString(arr));}}//返回边的数目public int getNumEdges() {return numOfEdge;}//返回下标对应的结点public String getValueOfVertex(int a) {return vertex.get(a);}
}
如果要示例图的矩阵 代码和运行效果如下