图的遍历
来源:互联网 发布:尼泊尔少年 知乎 编辑:程序博客网 时间:2024/06/16 19:42
DFS深度优先遍历:
1 .将顶点元素取出,标记该节点已经被访问过,放入栈中
2 .从栈中将顶点元素peek出来,查找他的没有被访问过的邻居节点,如果不存在,则将该顶点从栈中pop出来,如果存在邻居节点则将其标记为访问过,输出,入栈
3 .循环步骤2直至 栈为空
BFS广度优先遍历:
1.取出根节点,放入队列中,标记该节点已被访问过true
2.将队列中的根节点poll出来,访问他的所有相邻的节点,将他们的访问标记置为false,并将它们一一入栈
3.循环步骤直至队列为空
package GraphNew;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class SearchGraph { //顶点数组 public Vertex[] vertexlist; //二维邻接矩阵 public int[][] adj; //顶点个数 public int nvertext; public SearchGraph(int N){ vertexlist = new Vertex[N]; adj = new int[N][N]; nvertext = 0; } //添加顶点 public void addVertex(int key){ vertexlist[nvertext++] = new Vertex(key); } //添加边 public void addEdge(int start , int end){ adj[start][end] = 1; adj[end][start] = 1; } public int findadjunused(int v){ for(int i=0; i<nvertext;i++) { if(adj[i][v] == 1 && vertexlist[i].visted==false) return i; } return -1; } //图的深度优先遍历 public void dfs() { //首先访问零号节点 将访问标记置为true vertexlist[0].visted=true; //输出该顶点 System.out.println(vertexlist[0].data); //将该顶点压入栈中 Stack<Integer> stack = new Stack<Integer>(); stack.push(vertexlist[0].data); //判断栈是否为空 while(!stack.isEmpty()) { //将栈中元素取出 //遍历邻接矩阵 获取它的相邻且未被访问过的节点 int node = findadjunused(stack.peek()); //如果没有可以访问的节点,则将此节点pop if(node==-1) { stack.pop(); } else { //如果有的话,则将其标记为已经访问过 vertexlist[node].visted = true; stack.push(node); System.out.println(node); } } } //图的广度优先遍历 public void bfs(){ //首先访问零号节点 将访问标记置为true vertexlist[0].visted=true; System.out.println(vertexlist[0].data); //将该顶点放入队列中 Queue<Integer> queue = new LinkedList<Integer>(); queue.add(vertexlist[0].data); while(!queue.isEmpty()) { int root = queue.poll(); for(int i=0; i<nvertext; i++) { if(adj[root][i]==1 && vertexlist[i].visted==false) { vertexlist[i].visted = true; System.out.println(vertexlist[i].data); queue.add(i); } } } } public static void main(String args[]){ SearchGraph g=new SearchGraph(10); for(int i=0;i<10;i++) { g.addVertex(i); } g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 4); g.addEdge(1, 3); g.addEdge(1, 2); g.addEdge(3, 4); g.addEdge(3, 2); g.addEdge(3, 5); g.addEdge(3, 2); g.addEdge(2, 6); g.addEdge(4, 7); g.addEdge(5, 8); g.addEdge(3, 6); g.addEdge(6, 9); System.out.println("深度优先遍历"); g.dfs(); System.out.println("广度优先遍历"); g.bfs(); }}/* * 顶点类 * 包含标记访问符号 */class Vertex{ int data; public boolean visted; public Vertex(int data) { super(); this.data = data; }}
0 0
- 图:图的遍历(深度优先遍历、广度优先遍历)
- java图的遍历方式(深度遍历、广度遍历)
- java图的遍历方式(深度遍历、广度遍历)
- 图的遍历(深度遍历和广度遍历)
- 图的遍历:深度优先遍历和广度优先遍历
- 图的 深度遍历 广度遍历
- 图的深度遍历和广度遍历
- 图的遍历(深度优先遍历)
- 图的遍历:深度优先遍历
- 图的遍历:宽度优先遍历
- 图的广度遍历和深度遍历
- 图的深度遍历和广度遍历
- 图的遍历-深度优先遍历
- 图的遍历-广度优先遍历
- 图的dfs遍历和bfs遍历
- 图的深度遍历和广度遍历
- 图的遍历算法-马遍历棋盘
- 图的遍历算法-马遍历棋盘
- Windows7 下 使用EasyBCD从磁盘安装Linux Mint
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- Scalaz(33)- Free :算式-Monadic Programming
- 【ITOO】--- 考评登录
- PHP递归搜索目录
- 图的遍历
- 字符串常量 解析
- HDU1007 Quoit Design 分治
- tableView的优化方法
- MySql 出现忘记密码时 应该如何登陆?
- 动态规划方法解旅行商问题(TSP Traveling Salesperson Problem)
- HDU 1852,1452 a^n的约数和
- C++卷积神经网络实例:tiny_cnn代码详解(8)——partial_connected_layer层结构类分析(上)
- jquery ajax的使用