一、图的遍历

图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历基本思想。

二、深度优先遍历

图的深度优先搜索(Depth First Search)。
深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深1度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解: 每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。

三、广度优先遍历

图的广度优先搜索(Broad First Search)。类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序.以便按这个顺序来访问这些结点的邻接结点 。

四、代码实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;public class Graph {//储存顶点的集合private ArrayList<String> vertexList;//储存图对应的领接矩阵private int[][] edges;//边的数目private int numOfEdges;//记录某个节点是否被访问private boolean[] isVisited;public Graph(int n) {//初始化矩阵edges = new int[n][n];vertexList = new ArrayList<>(n);numOfEdges = 0;isVisited = new boolean[n];}/*** 深度优先遍历*/public void dfs() {isVisited=new boolean[getNumOfVertex()];//    遍历所有的节点,进行dfsfor (int i = 0; i < getNumOfVertex(); i++) {if (!isVisited[i]) {dfs(isVisited, i);}}}/*** 深度优先遍历** @param isVisited* @param i*/public void dfs(boolean[] isVisited, int i) {//    输出访问节点System.out.print(getValueByIndex(i) + " ");//    将该节点设置为已经访问isVisited[i] = true;//    查找节点i的第一个领结节点wint w = getFirstNeighbor(i);//如果存在邻接节点while (w != -1) {//如果这个节点没有被访问;if (!isVisited[w]) {dfs(isVisited, w);}//    如果w节点应景访问了w = getNextNeighbor(i, w);}}/*** 广度优先** @param isVisited* @param i*/private void bfs(boolean[] isVisited, int i) {//队列的头结点int u;//队列的领结节点int w;//队列,记录访问顺序LinkedList<Integer> queue = new LinkedList();//访问节点输出信息System.out.print(getValueByIndex(i) + " ");//标记为已访问节点isVisited[i] = true;//将节点加入队列queue.addLast(i);//while (!queue.isEmpty()) {//  取出队列的头结点下标u = queue.removeFirst();//   得到第一个领结节点的下标w = getFirstNeighbor(u);//    找到了while (w != -1) {//    是否访问过if (!isVisited[w]) {System.out.print(getValueByIndex(w) + " ");//    标记已经访问过isVisited[w] = true;//    入队queue.addLast(w);}//    以u为前驱点,找w后面的下一个节点,此处体现广度优先w = getNextNeighbor(u, w);}}}public void bfs() {isVisited=new boolean[getNumOfVertex()];for (int i = 0; i < getNumOfVertex(); i++) {if (!isVisited[i]) {bfs(isVisited, i);}}}/*** 得到第一个领结节点的下标** @param index* @return*/public int getFirstNeighbor(int index) {for (int i = 0; i < vertexList.size(); i++) {//判断边是否存在,存在默认为1if (edges[index][i] > 0) {return i;}}return -1;}/*** 根据当前节点v1,v2寻找下一个领结节点** @param v1* @param v2* @return*/public int getNextNeighbor(int v1, int v2) {for (int i = v2 + 1; i < vertexList.size(); i++) {if (edges[v1][i] > 0) {return i;}}return -1;}/*** 返回节点的个数** @return*/public int getNumOfVertex() {return vertexList.size();}/*** 得到边的数目** @return*/public int getNumOfEdges() {return numOfEdges;}/*** 根据下标,返回对应的数据** @param index* @return*/public String getValueByIndex(int index) {return vertexList.get(index);}/*** 获取val1,val2的权值** @param val1* @param val2* @return*/public int getWeight(int val1, int val2) {return edges[val1][val2];}/*** 插入节点** @param vertex*/public void insertVertex(String vertex) {vertexList.add(vertex);}/*** 添加边** @param val1   表示点的下标* @param val2   表示点的下标* @param weight 表示对应的值*/public void insetEdge(int val1, int val2, int weight) {edges[val1][val2] = weight;edges[val2][val1] = weight;numOfEdges++;}/*** 显示图对应的矩阵*/public void showGraph() {for (int[] item : edges) {System.out.println(Arrays.toString(item));}}
}

五、测试

public class GraphDemo {public static void main(String[] args) {//    测试图String[] vertexs = {"1", "2", "3", "4", "5","6","7","8"};//    创建图形Graph graph = new Graph(vertexs.length);//   循环的添加订单for (String vertex : vertexs) {graph.insertVertex(vertex);}//    添加边graph.insetEdge(0, 1, 1);graph.insetEdge(0, 2, 1);graph.insetEdge(1, 3, 1);graph.insetEdge(1, 4, 1);graph.insetEdge(3, 7, 1);graph.insetEdge(4, 7, 1);graph.insetEdge(2, 5, 1);graph.insetEdge(2, 6, 1);graph.insetEdge(5, 6, 1);//显示领接矩阵graph.showGraph();//    深度遍历邻接矩阵System.out.println("深度优先");graph.dfs();System.out.println();System.out.println("广度优先");graph.bfs();}
}
[0, 1, 1, 0, 0, 0, 0, 0]
[1, 0, 0, 1, 1, 0, 0, 0]
[1, 0, 0, 0, 0, 1, 1, 0]
[0, 1, 0, 0, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0, 1, 0]
[0, 0, 1, 0, 0, 1, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0]
深度优先
1 2 4 8 5 3 6 7
广度优先
1 2 3 4 5 6 7 8 

图深度优先、广度优先遍历(java)相关推荐

  1. 获取图顶点的入度、出度;获取图的两个顶点之间的权值; 图的深度优先算法、图的广度优先遍历

    广度优先结果: 深度优先结果: 代码整理: public class Graph {private int vertexSize;//顶点数量private int[] vertexs;//顶点数组p ...

  2. 图论算法(5):图的广度优先遍历 BFS

    本章节内容使用 java 实现,Github 代码仓:https://github.com/ZhekaiLi/Code/tree/main/Graph/src 查看文章内的图片可能需要科学上网! 因为 ...

  3. [C] 图的广度优先遍历

    图的广度优先遍历 我一直觉得图的遍历没有地图类型的题目难,遍历嘛,每个点都走一遍就行了. 但是给定地图求面积啊,数量啊的那种题目,花样挺多的. 图的遍历真挺难把人绕晕的,关于广度优先,理解好层层递进这 ...

  4. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

  5. 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储 ...

  6. 数据结构 图的广度优先遍历 C++

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Bool ...

  7. 二十三、图的广度优先遍历

    二十三.图的广度优先遍历 文章目录 二十三.图的广度优先遍历 题目描述 解题思路 上机代码 题目描述 程序的输入是无向图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志).程序 ...

  8. 数据结构之栈的应用:树的层次遍历、图的广度优先遍历、OS的FCFS策略

    栈的应用:树的层次遍历.图的广度优先遍历.OS的FCFS策略 树的层次遍历: 图的广度优先遍历 OS的FCFS策略: 树的层次遍历: 算法思想: 1.先遍历头节点1,头节点1入队 2.在遍历头节点的孩 ...

  9. 数据结构笔记(二十八)-- 图的广度优先遍历

    图的广度优先遍历 一.基本思想 二.图的广度优先遍历举例 三.伪代码实现 邻接点的访问的实现需要根据图的存储方式来进行实现

  10. Day 33 图的广度优先遍历

    图的广度优先遍历 33.1 与树的广度优先遍历类似. 33.2 为每个核心方法写一个测试方法,这叫单元测试. 代码: /***************** Breadth first traversa ...

最新文章

  1. oracle rac启停数据库,Oracle rac 启动停止操作文档 PDF 下载
  2. python知网查重_用Python写了个检测抄袭/文章去重算法(nshash)
  3. PHP程序员如何突破成长瓶颈(转)
  4. Spark RDD在Spark中的地位和作用如何?
  5. mysql学习(2)索引的本质
  6. 光模块是怎么分类的?光模块的应用及作用有哪些?
  7. 【载誉】致远互联荣获“2017最佳协同管理解决方案”殊荣
  8. Android 获取imageview的图,在另一个imageview里显示,还能得到图片
  9. springboot mybatis 事务_真香——Github上的优秀SpringBoot框架
  10. 敏捷开发一千零一问:怎样处理重要但不明白的任务?
  11. pdca管理循环基本主张_两个经典的循环管理法:PDCA SDCA
  12. 超震撼数据可视化工具
  13. 频响函数和传递函数详解-工程实例
  14. Canvas: trying to draw too large bitmap 红米 k30 奔溃
  15. 玩家开发、出售《劲舞团》外挂获刑一年半
  16. 针对百度的常规网页优化策略
  17. 计算机页面不稳定怎么办,电脑网速不稳定怎么解决_电脑网速时快时慢的处理方法...
  18. 微信公众平台昵称乱码emoji表情
  19. 6个usb口服务器无响应,USB插口无反应怎么办?USB接口不能用解决办法
  20. 马士兵java ppt_[马士兵JAVA教程课件.ppt

热门文章

  1. springIOC和AOP
  2. 通证经济大局观(二十三):部落与技术进步
  3. 【mean teacher】IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python o的解决
  4. 淘宝API接口:item_search_img - 按图搜索淘宝商品(拍立淘)和 upload_img - 上传图片到淘宝
  5. Android代码删除通知,Android 删除 未接来电 通知
  6. 现成掘金之旅APP系统开发案例分享
  7. python自定义异常
  8. Mysql中的视图是什么?有什么作用?
  9. 腐烂国度2没人有计算机技能,腐烂国度2人物技能一览 全人物技能介绍
  10. Oracle sql语句执行顺序