Java实现图的遍历(深搜与广搜)
2015-09-10 12:22
591 查看
本文以邻接矩阵作为存储结构,用Java实现图的遍历,话不多说,先给出的图的结构,如下:
1、深度优先搜索遍历
思想:
沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。(百度百科)
代码如下:
2、广度优先搜索遍历
思想:
从根节点开始,沿着树的宽度、按照层次依次遍历树的节点;
代码如下:
1、深度优先搜索遍历
思想:
沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。(百度百科)
代码如下:
package com.ds.graph; public class DFSTraverse { // 构造图的边 private int[][] edges = { { 0, 1, 0, 0, 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 0, 0, 1, 0, 1 }, { 0, 1, 0, 1, 0, 0, 0, 0, 1 }, { 0, 0, 1, 0, 1, 0, 1, 1, 1 }, { 0, 0, 0, 1, 0, 1, 0, 1, 0 }, { 1, 0, 0, 0, 1, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 1, 1, 0, 1, 0, 0 }, { 0, 1, 1, 1, 0, 0, 0, 0, 0 } }; // 构造图的顶点 private String[] vertexs = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; // 记录被访问顶点 private boolean[] verStatus; // 顶点个数 private int vertexsNum = vertexs.length; public void DFSTra() { verStatus = new boolean[vertexsNum]; for (int i = 0; i < vertexsNum; i++) { if (verStatus[i] == false) { DFS(i); } } } // 递归深搜 private void DFS(int i) { System.out.print(vertexs[i] + " "); verStatus[i] = true; for (int j = firstAdjVex(i); j >= 0; j = nextAdjvex(i, j)) { if (!verStatus[j]) { DFS(j); } } } // 返回与i相连的第一个顶点 private int firstAdjVex(int i) { for (int j = 0; j < vertexsNum; j++) { if (edges[i][j] > 0) { return j; } } return -1; } // 返回与i相连的下一个顶点 private int nextAdjvex(int i, int k) { for (int j = (k + 1); j < vertexsNum; j++) { if (edges[i][j] == 1) { return j; } } return -1; } // 测试 public static void main(String[] args) { new DFSTraverse().DFSTra(); } }
2、广度优先搜索遍历
思想:
从根节点开始,沿着树的宽度、按照层次依次遍历树的节点;
代码如下:
package com.ds.graph; import java.util.LinkedList; import java.util.Queue; public class BFSTraverse_0100 { // 构造图的边 private int[][] edges = { { 0, 1, 0, 0, 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 0, 0, 1, 0, 1 }, { 0, 1, 0, 1, 0, 0, 0, 0, 1 }, { 0, 0, 1, 0, 1, 0, 1, 1, 1 }, { 0, 0, 0, 1, 0, 1, 0, 1, 0 }, { 1, 0, 0, 0, 1, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 1, 1, 0, 1, 0, 0 }, { 0, 1, 1, 1, 0, 0, 0, 0, 0 } }; // 构造图的顶点 private String[] vertexs = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; // 记录被访问顶点 private boolean[] verStatus; // 顶点个数 private int vertexsNum = vertexs.length; // 广搜 private void BFS() { verStatus = new boolean[vertexsNum]; Queue<Integer> temp = new LinkedList<Integer>(); for (int i = 0; i < vertexsNum; i++) { if (!verStatus[i]) { System.out.print(vertexs[i] + " "); verStatus[i] = true; temp.offer(i); while (!temp.isEmpty()) { int j = temp.poll(); for (int k = firstAdjvex(j); k >= 0; k = nextAdjvex(j, k)) { if (!verStatus[k]) { System.out.print(vertexs[k] + " "); verStatus[k] = true; temp.offer(k); } } } } } } // 返回与i相连的第一个顶点 private int firstAdjvex(int i) { for (int j = 0; j < vertexsNum; j++) { if (edges[i][j] > 0) { return j; } } return -1; } // 返回与i相连的下一个顶点 private int nextAdjvex(int i, int k) { for (int j = (k + 1); j < vertexsNum; j++) { if (edges[i][j] > 0) { return j; } } return -1; } // 测试 public static void main(String args[]) { new BFSTraverse_0100().BFS(); } }
相关文章推荐
- java简单的输入语句(字符串)
- JAVA基础应用——POI操作Excel
- PWC6345: There is an error in invoking javac
- Spring MVC 总结一(spring mvc 基本例子)
- java-list去除重复的对象
- Eclipse JAVA文件注释乱码
- java 排序算法--冒泡排序
- MyEclipse使用汇总——MyEclipse10设备SVN插入
- Java简单的输入语句练习(整型数据)
- java 值交换
- java类文件的单元测试
- java设计模式系列--单例模式
- Java7线程学习笔记(一)
- java中文所占字节数
- 路径分隔符 关于Java的File.separator
- Welcome to JAVA!(第二课课后练习)
- Java Gson 使用,Gson将字符串转为list
- Spring中@Async注解实现方法的异步调用
- springMVC中文件的下载和上传
- Eclipse调试Android工具集锦:怎样运行多个虚拟机