代码是根据矩阵来实现深度优先遍历的
邻接结点就是按照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) {//初始化矩阵和vertex
vertex=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);
}
}
如果要示例图的矩阵 代码和运行效果如下