主要实现图的两种形式的深度优先遍历,深度优先遍历类似于二叉树的先序遍历。但是因为图可能有多个连通分量,即可能不是连接在一起的,有的顶点可能和其他顶点都没有连接,所有需要依次访问每个顶点,然后对顶点做先序遍历。但由于图的顶点不止有两个孩子,所以采用while循环的方法
1.邻接矩阵的深度优先遍历
数据结构:
public class Graph {
String[] vertex = new String[5]; //顶点类型可自定义
int[][] edge = new int[5][5]; //边的类型可自定义
//省略get.set方法}
public class DFSTraverseGraph {
public static boolean[] visited = new boolean[5]; //假定顶点数为5
/**
* 邻接矩阵的深度优先遍历
*
* 类似于二叉树的先序遍历
* 因为图可能有多个连通分量 一次遍历一个连通分量
* @param g
*/
public static void dfsTraverseGraph(Graph g){
//初始化所有顶点状态都是未访问状态
for(int i = 0; i < 5; i++){
visited[i] = false;
}
for(int i = 0; i < g.getVertex().length; i++){
if(!visited[i]){
dfs(g, i);
}
}
}
private static void dfs(Graph g, int index){
int col = g.getVertex().length; //矩阵的列数,也就是顶点数
visited[index] = true; //把该顶点状态设为访问过
System.out.println("顶点信息:" + g.getVertex()[index]);//输出顶点信息
for(int j = 0; j < col; j++){
int[][] edge = g.getEdge();
if(edge[index][j] == 1 && !visited[j]){
dfs(g, j);
}
}
}
}
2.邻接表的深度优先遍历
数据结构:
public class AdjacentTable {
private static final int MAX_SIZE = 100; //能存放的最大顶点数
private VertexNode[] vertexNodes = new VertexNode[MAX_SIZE]; //存放顶点的数组
private int vertexNum; //顶点数 不能超过能存放顶点数的最大值
private int edgeNum; //边数 不能超过无向图的最大边数 即 n(n-1)/2 n为顶点数
//省略get.set方法}
public class VertexNode { private String data; //存放顶点结点信息 比如名称 private EdgeNode firstEdge; //指向与该结点相连的 顶点集合 的第一个结点 //省略get.set方法}
public class EdgeNode { private int adjvex; //存放该顶点在顶点列表中的下标(位置) private int weight; //权值 对于非网图可以不需要 所谓网图:就是带权的图 private EdgeNode next; //下一个邻接点
//省略get.set方法}
public class DFSTraverseGraph {
public static boolean[] visited = new boolean[5]; //假定顶点数为5
/**
* 邻接表的深度优先遍历
* 因为图可能有多个连通分量 一次遍历一个连通分量
* @param g
*/
public static void dfsTraverseGraphByAdjacentTable(AdjacentTable g){
/**
* 初始化顶点状态为未访问状态
*/
for(int i = 0; i < visited.length; i++){
visited[i] = false;
}
for(int i = 0; i < g.getVertexNum(); i++){
if(!visited[i]){
dfsAdjacentTable(g, i);
}
}
}
private static void dfsAdjacentTable(AdjacentTable g, int index){
visited[index] = true;
System.out.println("输出顶点信息:" + g.getVertexNodes()[index].getData());
EdgeNode node = g.getVertexNodes()[index].getFirstEdge();
while( node != null){
if(!visited[node.getAdjvex()]){
dfsAdjacentTable(g, node.getAdjvex());
}
node = node.getNext();
}
}
}