一.什么是深度遍历?
我们可以通过下面的图深入了解:
下面我们用代码重现上面的场景:
二.代码实现:
import java.util.Stack;
class Vertex{
public char label;//节点信息
public boolean visited;//存储节点是否被访问信息
public Vertex(char lab)
{
label=lab;
visited=false;
}
}
public class Graph {
private final int maxVertices=20;//定义最大节点数
private Vertex vertexList[];//节点数组
private int adjMatrix[][];//存储两点关系的数组
private Stack theStack;//辅助栈
private int vertexCount;//记录当前的节点数
public Graph()//图构造方法
{
vertexList = new Vertex[maxVertices];//分配空间
adjMatrix = new int[maxVertices][maxVertices];//分配空间
vertexCount=0;//初始值
for(int y=0;y<maxVertices;y++)
{
for(int x=0;x<maxVertices;x++)
{
adjMatrix[x][y]=0;//给所有点关系赋为0
}
theStack=new Stack();//分配空间
}
}
public void addVertex(char lab)//添加节点信息
{
vertexList[vertexCount++]=new Vertex(lab);
}
public void addEdge(int start,int end)//添加节点关系
{
adjMatrix[start][end]=1;
adjMatrix[end][start]=1;
}
public void displayVertex(int v)//展示节点信息
{
System.out.println(vertexList[v].label);
}
public void dfs()//深度遍历方法
{
vertexList[0].visited=true;
displayVertex(0);
theStack.push(0);
while(!theStack.isEmpty()){
int v=getAdjUnvisitedVertex((Integer) theStack.peek());
if(v==-1)
{
theStack.pop();
}
else{
vertexList[v].visited=true;
displayVertex(v);
theStack.push(v);
}
}
for(int j=0;j<vertexCount;j++)
vertexList[j].visited=false;
}
public int getAdjUnvisitedVertex(int v)//得到未被访问的节点位置
{
for(int j=0;j<vertexCount;j++)
{
if(adjMatrix[v][j]==1&&vertexList[j].visited==false)
return j;
}
return -1;
}
}
测试代码:
public class text {
public static void main(String[] args) {
Graph test=new Graph();
test.addVertex('A');
test.addVertex('B');
test.addVertex('C');
test.addVertex('D');
test.addVertex('E');
test.addVertex('F');
test.addVertex('G');
test.addVertex('H');//7
test.addEdge(0,1);
test.addEdge(1,2);
test.addEdge(1,7);
test.addEdge(2,3);
test.addEdge(2,4);
test.addEdge(4,7);
test.addEdge(4,6);
test.addEdge(4,5);
test.dfs();
}
}
结果: