JAVA-图的广度优先遍历
来源:互联网 发布:程序员的发展 编辑:程序博客网 时间:2024/06/15 20:58
1、建立结点类
//结点类public class Bread_Node { // 顶点内容 private String data; // 顶点是否被访问过,true为已被访问,false为未被访问 private boolean isVisited; public Bread_Node(String data) { this.data = data; } public String getData() { return data; } public void setData(String data) { this.data = data; } public boolean isVisited() { return isVisited; } public void setVisited(boolean isVisited) { this.isVisited = isVisited; }}
2、建立一个类存储图的数据
//数据源public class Bread_GraphData { // 邻接矩阵 public int[][] getMatrix() { // 1代表有边,0代表无边 int[][] matrix = { { 0, 1, 0, 1, 0, 0, 0, 0 }, { 1, 0, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 1, 1 }, { 0, 0, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0 } }; return matrix; } // 顶点标签 public String[] getNodeData() { String[] nodeData = { "A", "B", "C", "D", "E", "F", "G", "H" }; return nodeData; }}
3、图的广度优先遍历算法
//广度优先遍历import java.util.ArrayList;import java.util.List;import java.util.Vector;public class BreadthFirstTraverse { private List<Bread_Node> list = new ArrayList<Bread_Node>(); private Bread_GraphData gd = new Bread_GraphData(); // 邻接矩阵 private int[][] matrix = gd.getMatrix(); /** * 遍历树的过程中,同一层的结点存放到一个数组中, * 树有多少层则需要多少个数组来存放 * @param nodeIndex */ public void breadthFirstTraverse(int nodeIndex) { // 所有的顶点数据 String[] nodeData = gd.getNodeData(); // 结点列表,存储所有的顶点 for (String data : nodeData) { list.add(new Bread_Node(data)); } // 取得传进来的结点下标对应的结点 Bread_Node node = list.get(nodeIndex); // 打印传进来的结点 System.out.print(node.getData() + " "); // 标记为已访问 node.setVisited(true); // 当前数组,存储这一层已确定的顶点的索引 Vector<Integer> curVec = new Vector<Integer>(); // 添加传进来的顶点的索引到当前数组中 curVec.add(nodeIndex); breadthFirstTraverse_Inner(curVec); } // 传进去的是上一层顶点数组 private void breadthFirstTraverse_Inner(Vector<Integer> preVec) { // 当前这一层的数组 Vector<Integer> curVec = new Vector<Integer>(); /** * preVec.size()表示上一层的结点个数 下面的for循环一完成,就表示已将preVec的下一层顶点全都访问完了 */ for (int i = 0; i < preVec.size(); i++) { // 由邻接矩阵判断传进来的上一层数组中的结点与其他结点有无连接 for (int j = 0; j < matrix.length; j++) { // 有边 if (matrix[preVec.get(i)][j] != 0) { // 若已被访问过 if (list.get(j).isVisited()) { continue; } else { // 没有被访问过 // 访问该顶点,输出 System.out.print(list.get(j).getData() + " "); // 设置该顶点为已被访问 list.get(j).setVisited(true); // 将该顶点放入当前这一层的数组中 curVec.add(j); } } } } // 判断本层是否存在刚被访问过的顶点 if (curVec.size() == 0) { // 若本层无顶点,那下面的层就更不存在了 return; } else { breadthFirstTraverse_Inner(curVec); } }}
4、测试
//测试类//广度优先遍历结果:A B D C F G H E public class Bread_Test { public static void main(String[] args) { BreadthFirstTraverse bft = new BreadthFirstTraverse(); bft.breadthFirstTraverse(0); }}
5、测试结果
阅读全文
0 0
- JAVA-图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的广度优先遍历
- 图的遍历-(深度优先&广度优先)
- 图的遍历:深度优先、广度优先
- java广度优先遍历
- Java图的遍历(深度优先遍历、广度优先遍历)
- ImportError: No module named cv2 in ubuntu 16.04 Anaconda2
- Andrew Ng机器学习课程笔记--汇总
- storm计数器(小白看懂系列)
- python基础--dict{}
- Java Executor 框架学习总结
- JAVA-图的广度优先遍历
- Class.isAssignableFrom与 instanceof 区别
- opencv13-#pragma comment()的使用和注意
- 嵌入式学习笔记(第九天)系统网络续
- Java基础--static关键字
- css中的浮动以及如何清除浮动
- javaWeb文档预览之OpenOfiice踩过的坑
- Guava(一)Lists与Maps
- DFS+奇偶剪枝