深度优先搜索与广度优先搜索
来源:互联网 发布:java多线程高并发购票 编辑:程序博客网 时间:2024/06/11 05:18
一、基本实现
深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
二、代码实现
import java.util.LinkedList; import java.util.Queue; import java.util.Stack;public class Graph { private int number = 9; private boolean[] flag; private String[] vertexs = { "A", "B", "C", "D", "E", "F", "G", "H", "I" }; private int[][] edges = { { 0, 1, 0, 0, 0, 1, 1, 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 } }; void DFSTraverse() { flag = new boolean[number]; for (int i = 0; i < number; i++) { if (flag[i] == false) {// 当前顶点没有被访问 DFS(i); } } } void DFS(int i) { flag[i] = true;// 第i个顶点被访问 System.out.print(vertexs[i] + " "); for (int j = 0; j < number; j++) { if (flag[j] == false && edges[i][j] == 1) { DFS(j); } } } void DFS_Map(){ flag = new boolean[number]; Stack<Integer> stack =new Stack<Integer>(); for(int i=0;i<number;i++){ if(flag[i]==false){ flag[i]=true; System.out.print(vertexs[i]+" "); stack.push(i); } while(!stack.isEmpty()){ int k = stack.pop(); for(int j=0;j<number;j++){ if(edges[k][j]==1&&flag[j]==false){ flag[j]=true; System.out.print(vertexs[j]+" "); stack.push(j); break; } } } } } void BFS_Map(){ flag = new boolean[number]; Queue<Integer> queue = new LinkedList<Integer>(); for(int i=0;i<number;i++){ if(flag[i]==false){ flag[i]=true; System.out.print(vertexs[i]+" "); queue.add(i); while(!queue.isEmpty()){ int k=queue.poll(); for(int j=0;j<number;j++){ if(edges[k][j]==1&&flag[j]==false){ flag[j] = true; System.out.print(vertexs[j]+" "); queue.add(j); } } } } } } public static void main(String[] args) { Graph graph = new Graph(); System.out.println("DFS递归:"); graph.DFSTraverse(); System.out.println(); System.out.println("DFS非递归:"); graph.DFS_Map(); System.out.println(); System.out.println("BFS非递归:"); graph.BFS_Map(); } }
阅读全文
0 0
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索 .
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 广度优先搜索与深度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索与广度优先搜索
- Swift 属性
- asp.net 查看dll的PublicKeyToken值方法
- n皇后问题
- Kotiln的简单实用!
- MySQL总结—基础篇(二)
- 深度优先搜索与广度优先搜索
- Mysql几种时间类型
- 6.RPC框架的简单实现(服务发布-rmi协议)
- Java的内存机制
- C语言:二维数组及其定义
- 纪录死在高德地图的第一次
- JS fun参数转换
- C++里union
- Hive parquet 表查询报错