JAVA数据结构–邻接矩阵图的遍历
深度优先遍历
遍历顺序:1==》0==》3==》2
从这图上看,可以看出DSF是一个递归的方法。
邻接矩阵图DFS完整代码:
public int getFirstNeibor(String name) {//获取第一个邻接顶点,参数为顶点名字
int index = findByName(name);//获取顶点名称对应的下标
for (int i = 0; i < numOfVertex; i++) {//在邻接矩阵顶点对应的列寻找第一条可通的边
if (Edge[index][i] < MAX) {//权重小于无穷大,返回此边对应终点顶点下标
return i;
}
}
return -1;//不存在邻接顶点,返回-1
}
public int getNextNeibor(String goal, String pre) {//获取下一个邻接顶点,参数:goal:当前遍历顶点,即寻找goal的下一个邻接顶点。
//pre:上一个邻接顶点,即从上一个已经被遍历的顶点开始寻找下一个顶点
int G = findByName(goal);//获取顶点goal的下标
int P = findByName(pre);
for (int i = P + 1; i < numOfVertex; i++) {//从P+1开始寻找,即上一个被遍历过的邻接顶点的下一个位置开始寻找
if (Edge[G][i] < MAX) {//若小于无穷大,返回该邻接顶点下标
return i;
}
}
return -1;
}
public void DFS(String name) {
System.out.print(name + "-->");//打印输出
int v = findByName(name);//开始遍历顶点坐标
isVisit[v] = true;//当前遍历顶点变成true,表示已被遍历过
int i = getFirstNeibor(name);//获取第一个邻接顶点
while (i != -1) {
if (!isVisit[i]) {//未被访问,深度遍历该顶点
DFS(Vertex[i]);
}
i = getNextNeibor(name, Vertex[i]);//获取下一个顶点,若没有,跳出循环返回上一层递归,即返回上一节点
//存在下一个邻接顶点,则对该邻接顶点进行DSF
}
}
测试代码
public class Main {
public static void main(String[] args) {
Graph g = new Graph(20);
g.insertVertex("A");
g.insertVertex("B");
g.insertVertex("C");
g.insertVertex("D");
g.insertVertex("E");
g.insertEdge("A", "B", 2);
g.insertEdge("A", "C", 5);
g.insertEdge("A", "D", 1);
g.insertEdge("C", "D", 1);
g.insertEdge("C", "B", 3);
g.insertEdge("D", "E", 9);
g.insertEdge("E", "B", 10);
g.insertEdge("E", "C", 1);
g.DFS("A");
}
}
测试结果
广度优先遍历
遍历顺序:1==》0==》3==》2
public void BFS(String name) {
System.out.print(name + "-->");//输出顶点名
Queue<String> queue = new LinkedList<String>();
//findByName(String name)是通过顶点名称返回顶点在矩阵中的对应下标
int v = findByName(name);//获取起始顶点名下标
isVisit[v] = true;//是初始顶点变为访问过
queue.add(name);//加入队列,作为第一个访问顶点
while (!queue.isEmpty()) {//队列空时,即无下一遍历顶点,退出循环
int v1 = findByName(queue.poll());//取队头,作为当前访问顶点
int v2 = getFirstNeibor(Vertex[v1]);//获取第一个
while (v2 != -1) {//若无邻接顶点,结束循环
if (!isVisit[v2]) {//邻接顶点是否被访问过
System.out.print(Vertex[v2] + "-->");
isVisit[v2] = true;//将此顶点归为访问过
queue.add(Vertex[v2]);//此顶点加入队列,作为下一层循环的开始顶点
}
v2 = getNextNeibor(Vertex[v1], Vertex[v2]);//获取当前顶点的下一邻接顶点
}
}
}