一.图的深度优先遍历
1.基本思想
从初始访问节点出发,首先访问第一个节点,然后再以这个被访问的节点的邻接节点作为初始节点,访问它的第一个邻接节点,依次进行,显然这是一个递归的过程
2.算法步骤
1)访问初始节点v,并标记节点v以访问
2)查找节点v的第一个邻接节点w
3)若w存在,执行4,若w不存在,回到第一步,从v的下一个节点继续
4)若w未被访问,对w进行深度优先遍历递归
5)若w被访问,以下一个邻接节点作为初始节点进行递归
3.代码实现
//得到第一个结点的下标
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;
}
//深度优先遍历
/* isVisited[] 记录节点是否访问的数组
* i 第一次是0
*/
public void dfs(boolean[] isVisited,int i){
//首先访问该节点,输出
System.out.print(getValueByIndex(i)+"->");
isVisited[i]=true;
int w=getfirstNeighbor(i);
while(w!=-1){
//说明有邻接节点
if(!isVisited[w]){
dfs(isVisited,w);
}
//如果该节点被访问
w=getNextNeighbor(i,w);
}
}
//重载dfs方法
public void dfs(){
isVisited=new boolean[vertexList.size()];
//遍历所有的节点进行dfs回溯
for(int i=0;i<vertexList.size();i++){
if(!isVisited[i]){
dfs(isVisited,i);
}
}