【图数据结构的遍历】java实现广度优先和深度优先遍历
【图数据结构的遍历】java实现广度优先和深度优先遍历
宽度优先搜索(BFS)遍历图需要使用队列queue数据结构; 深度优先搜索(DFS, Depth First Search)的实现
需要使用到栈stack数据结构。
java中虽然有Queue接口,单java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。
java中定义队列 一般这样定义: Queue queue = new LinkedList();
java中的栈由java.util.Stack类实现,是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来。
E push(E item) 把项压入堆栈顶部。
E pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。
E peek() 查看堆栈顶部的对象,但不从堆栈中移除它。
boolean empty() 测试堆栈是否为空。
int search(Object o) 返回对象在堆栈中的位置,以 1 为基数。
BFS和DFS遍历代码实现如下:
import java.util.*;/*** 使用java实现图的图的广度优先 和深度优先遍历算法。*/
public class GraphLoopTest {private Map<String, List<String>> graph = new HashMap<String, List<String>>();/*** 初始化图数据:使用邻居表来表示图数据。*/public void initGraphData() {
// 图结构如下
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
// \ | / \ /
// 8 9graph.put("1", Arrays.asList("2", "3"));graph.put("2", Arrays.asList("1", "4", "5"));graph.put("3", Arrays.asList("1", "6", "7"));graph.put("4", Arrays.asList("2", "8"));graph.put("5", Arrays.asList("2", "8"));graph.put("6", Arrays.asList("3", "8", "9"));graph.put("7", Arrays.asList("3", "9"));graph.put("8", Arrays.asList("4", "5", "6"));graph.put("9", Arrays.asList("6", "7"));}/*** 宽度优先搜索(BFS, Breadth First Search)* BFS使用队列(queue)来实施算法过程*/private Queue<String> queue = new LinkedList<String>();private Map<String, Boolean> status = new HashMap<String, Boolean>();/*** 开始点** @param startPoint*/public void BFSSearch(String startPoint) {//1.把起始点放入queue;queue.add(startPoint);status.put(startPoint, false);bfsLoop();}private void bfsLoop() {// 1) 从queue中取出队列头的点;更新状态为已经遍历。String currentQueueHeader = queue.poll(); //出队status.put(currentQueueHeader, true);System.out.println(currentQueueHeader);// 2) 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入queue中。List<String> neighborPoints = graph.get(currentQueueHeader);for (String poinit : neighborPoints) {if (!status.getOrDefault(poinit, false)) { //未被遍历if (queue.contains(poinit)) continue;queue.add(poinit);status.put(poinit, false);}}if (!queue.isEmpty()) { //如果队列不为空继续遍历bfsLoop();}}/*** 深度优先搜索(DFS, Depth First Search)* DFS使用队列(queue)来实施算法过程* stack具有后进先出LIFO(Last Input First Output)的特性,DFS的操作步骤如下:*/
// 1、把起始点放入stack;
// 2、重复下述3步骤,直到stack为空为止:
// 从stack中访问栈顶的点;
// 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入stack中;
// 如果此点没有尚未遍历的邻接点,则将此点从stack中弹出。private Stack<String> stack = new Stack<String>();public void DFSSearch(String startPoint) {stack.push(startPoint);status.put(startPoint, true);dfsLoop();}private void dfsLoop() {if(stack.empty()){return;}//查看栈顶元素,但并不出栈String stackTopPoint = stack.peek();// 2) 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入queue中。List<String> neighborPoints = graph.get(stackTopPoint);for (String point : neighborPoints) {if (!status.getOrDefault(point, false)) { //未被遍历stack.push(point);status.put(point, true);dfsLoop();}}String popPoint = stack.pop();System.out.println(popPoint);}public static void main(String[] args) {GraphLoopTest test = new GraphLoopTest();test.initGraphData();
// test.BFSSearch("1");test.DFSSearch("1");}
}
转载于:https://www.cnblogs.com/honeybee/p/8557159.html
【图数据结构的遍历】java实现广度优先和深度优先遍历相关推荐
- 0302Prim算法-最小生成树-图-数据结构和算法(Java)
文章目录 1 Prim算法 1.1 概述 1.1.1 算法描述 1.1.2 数据结构 1.1.3 横切边集合维护 1.2 延时实现 1.2.1 实现代码 1.2.2 性能分析 1.3 即时实现 1.3 ...
- 【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用
无向图满足约束条件的路径 •[目的]:掌握深度优先遍历算法在求解图路径搜索问题的应用 [内容]:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径: (1)给定起点u和终点v. ...
- 图解红黑树及Java进行红黑二叉树遍历的方法
红黑树 红黑树是一种数据结构与算法课堂上常常提到但又不会细讲的树,也是技术面试中经常被问到的树,然而无论是书上还是网上的资料,通常都比较刻板难以理解,能不能一种比较直观的方式来理解红黑树呢?本文将以图 ...
- dfs遍历和bfs遍历python_广度优先遍历(BFS)和深度优先遍历(DFS)
BFS: 思想: 对于图中的初始节点,先遍历初始节点的一阶邻居,当初始节点的一阶邻居都被遍历完了之后,再遍历初始节点的二阶邻居,直至所有节点都被遍历完(或找到符合条件的节点) 过程: 三要素:(1)先 ...
- 广度优先遍历类似于二叉树的_深度优先遍历类似于二叉树的()
(1)[◆题库问题◆]:[单选] 深度优先遍历类似于二叉树的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 [◆参考答案◆]:A ·ℳ°.·※°∴ ╰☆╮ .·ℳ°.·※°∴ ╰☆╮ . ...
- Java迷宫代码,深度优先遍历
此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑. 如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径. 方向常量定义: ...
- 循环遍历java属性_java中循环遍历实体类的属性和数据类型以及属性值
package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTarg ...
- 遍历JSON所有节点(深度优先遍历)
var json = {a: { b: { c: 1 } },d: [25, 26]}function dfs(root, path) {console.log(root, path);Object. ...
- 数据结构-深度优先遍历和广度优先遍历(漫画)
----- 第二天 ----- ------------ 什么是 深度/广度 优先遍历? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth F ...
最新文章
- 清华北大留不住,高中毕业去美国读AI本科值不值?
- loadlibrary 失败_职称评审失败的原因有哪些?
- Redhat7开机图形或文字界面
- JQuery------获取input type=file中的文件内容
- poj3581Sequence(后缀数组)
- UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
- Py之portalocker:portalocker的简介、安装、使用方法之详细攻略
- 连接关键词用什么符号
- 【Oracle】Python 连接Oracle 数据库
- Kotlin 1.2 新特性
- ActiveMQ学习总结(5)——Java消息服务JMS详解
- 利用WPS 2013文字制作精美的信纸的方法
- TIOBE 11 月榜单:C、Swift、Go、D 与 Rust 起起伏伏
- 使用axure的团队项目功能
- 解决:SpringBoot 搭建聚合项目 报 “程序包XXX不存在”
- 如何使用InetAddress在Java中获取IP地址
- 中国电信中国电信物联网开放平台-连接管理子系统 http返回为空
- 国内工业软件排行榜、市场份额与主要玩家
- [转载] 杜拉拉升职记——14 猜猜为啥请晚餐
- linux下解压dmp文件怎么打开,查看dmp文件