DFS的方法步骤:
- 1.访问初始结点v,并标记结点v为已访问
- 2.查找结点v的第一个邻接节点w
- 3.若w存在,则继续执行4,如果w不存在,则回到第一步,将从v的下一个结点继续
- 4.若w未访问,对w进行深度优先遍历递归(即把w当做另一个v,然后进行步骤123)
- 5.查找结点v的w邻接节点的下一个邻接节点,转到步骤3
得到第一个邻接节点的下标w
//得到第一个邻接节点的下标w
/*
* 如果存在,就返回对应的下标,否则返回-1
*/
public int getFirstNeighbor(int index) {
for(int j=0;j<vertexList.size();j++) {
if(edges[index][j]>0) {
return j;
}
}
return -1;
}
根据前一个邻接节点的下标来获取下一个邻接节点
//根据前一个邻接节点的下标来获取下一个邻接节点
public int getNextNeighbor(int v1,int v2) {
for(int j=v2+1;j<vertexList.size();j++) {
if(edges[v1][j]>0) {
return j;
}
}
return -1;
}
深度优先遍历算法
//深度优先遍历算法
//i第一次就是0
public void DFS(boolean []isVisited,int i) {
System.out.println("输出该结点");
//将这个结点设置为已经访问过
isVisited[i]=true;
//查找结点i的第一个邻接节点
int w = getFirstNeighbor(i);
while(w !=-1) {//有邻接节点
if(!isVisited[w]) {
DFS(isVisited,w);
}
//如果w已经被访问过
w = getNextNeighbor(i, w);
}
}
//对dfs进行一个重载,遍历所有结点,并进行dfs
public void DFS() {
//遍历所有的结点进行dfs(回溯)
for(int i=0;i<vertexList.size();i++) {
if(!isVisited[i]) {
DFS(isVisited,i);
}
}
}