深度优先搜索与广度优先搜索
2017-09-12 16:22
260 查看
一、基本实现
深度优先搜索用栈(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(); } }
相关文章推荐
- 图的遍历之 深度优先搜索和广度优先搜索
- 深度优先搜索和广度优先搜索
- 深度优先搜索与广度优先搜索
- 图的创建、广度优先搜索、深度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索和广度优先搜索
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- 【算法学习】二、深度优先搜索与广度优先搜索
- 深度优先搜索和广度优先搜索
- 图的遍历之 深度优先搜索和广度优先搜索
- 算法之深度优先搜索和广度优先搜索
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- 图算法-深度优先搜索和广度优先搜索
- 深度优先搜索与广度优先搜索
- 深度优先搜索和广度优先搜索
- 图的遍历 深度优先搜索 广度优先搜索
- 图搜索之A*算法、深度优先搜索和广度优先搜索
- AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 搜索图:即深度优先搜索和广度优先搜索
- 【算法——02】图的遍历——BFS广度优先搜索、DFS深度优先搜索