关于图的遍历实际上就两种
广度优先和深度优先,一般关于图的遍历都是基于邻接矩阵的,考试这些,用的也是邻接矩阵。
本篇文章先介绍广度优先遍历的原理,和代码实现
什么是图的广度优先遍历?
这其实和二叉树的层序遍历非常相似,大家都喜欢看例子,那我就举例子:
若对这个无向图,从A节点开始进行广度优先遍历:
那么它的顺序就应该是:
遍历方式:
借助队列queue,以及一个boolean类型的数组arr,用来记录顶点是否已经访问:
public void traverse(char v){//需要的顶点Queue<Character> queue=new LinkedList<>();/** vertexS是储存所有顶点的字符数组* _getIndexOfV(传入一个字符(顶点))---->这个函数可以获得对应vertexS数组的下标* * */boolean[] visited=new boolean[vertexS.length];//定义,用来标记是否已近访问queue.offer(v);while(!queue.isEmpty()){char vertex= queue.poll();//出队列,一个System.out.print(vertex);//直接打印int index=_getIndexOfV(vertex);//获得下标visited[index]=true;//出队列就要置为空for (int i = 0; i < vertexS.length ; i++) {//遍历第index行的(在当前顶点周围搜索是否有顶点链接)if(matrix[index][i]!=0&&!visited[i]){queue.offer(vertexS[i]);//入队列visited[i]=true;//入队就要标记,免得等一下重复入队,造成严重后果}}if(!queue.isEmpty()){//不为空就加一个箭头System.out.print(" -> ");}}}
以这个图作为测试:
public class Test {public static void main(String[] args) {char[] array = {'A', 'B', 'C', 'D','E'};GrapByMatrix grap = new GrapByMatrix(array, false);grap.addEdge('A', 'B', 1);grap.addEdge('A', 'D', 1);grap.addEdge('B', 'C', 1);grap.addEdge('A', 'C', 1);grap.traverse('A');}
}
执行结果: