【图数据结构的遍历】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实现广度优先和深度优先遍历相关推荐

  1. 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 ...

  2. 【图的遍历】广度优先遍历(DFS)、深度优先遍历(BFS)及其应用

    无向图满足约束条件的路径 •[目的]:掌握深度优先遍历算法在求解图路径搜索问题的应用 [内容]:编写一个程序,设计相关算法,从无向图G中找出满足如下条件的所有路径:   (1)给定起点u和终点v.   ...

  3. 图解红黑树及Java进行红黑二叉树遍历的方法

    红黑树 红黑树是一种数据结构与算法课堂上常常提到但又不会细讲的树,也是技术面试中经常被问到的树,然而无论是书上还是网上的资料,通常都比较刻板难以理解,能不能一种比较直观的方式来理解红黑树呢?本文将以图 ...

  4. dfs遍历和bfs遍历python_广度优先遍历(BFS)和深度优先遍历(DFS)

    BFS: 思想: 对于图中的初始节点,先遍历初始节点的一阶邻居,当初始节点的一阶邻居都被遍历完了之后,再遍历初始节点的二阶邻居,直至所有节点都被遍历完(或找到符合条件的节点) 过程: 三要素:(1)先 ...

  5. 广度优先遍历类似于二叉树的_深度优先遍历类似于二叉树的()

    (1)[◆题库问题◆]:[单选] 深度优先遍历类似于二叉树的() A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 [◆参考答案◆]:A ·ℳ°.·※°∴ ╰☆╮ .·ℳ°.·※°∴ ╰☆╮ . ...

  6. Java迷宫代码,深度优先遍历

    此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑. 如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径. 方向常量定义: ...

  7. 循环遍历java属性_java中循环遍历实体类的属性和数据类型以及属性值

    package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTarg ...

  8. 遍历JSON所有节点(深度优先遍历)

    var json = {a: { b: { c: 1 } },d: [25, 26]}function dfs(root, path) {console.log(root, path);Object. ...

  9. 数据结构-深度优先遍历和广度优先遍历(漫画)

    -----  第二天  ----- ------------ 什么是 深度/广度 优先遍历? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth F ...

最新文章

  1. 清华北大留不住,高中毕业去美国读AI本科值不值?
  2. loadlibrary 失败_职称评审失败的原因有哪些?
  3. Redhat7开机图形或文字界面
  4. JQuery------获取input type=file中的文件内容
  5. poj3581Sequence(后缀数组)
  6. UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
  7. Py之portalocker:portalocker的简介、安装、使用方法之详细攻略
  8. 连接关键词用什么符号
  9. 【Oracle】Python 连接Oracle 数据库
  10. Kotlin 1.2 新特性
  11. ActiveMQ学习总结(5)——Java消息服务JMS详解
  12. 利用WPS 2013文字制作精美的信纸的方法
  13. TIOBE 11 月榜单:C、Swift、Go、D 与 Rust 起起伏伏
  14. 使用axure的团队项目功能
  15. 解决:SpringBoot 搭建聚合项目 报 “程序包XXX不存在”
  16. 如何使用InetAddress在Java中获取IP地址
  17. 中国电信中国电信物联网开放平台-连接管理子系统 http返回为空
  18. 国内工业软件排行榜、市场份额与主要玩家
  19. [转载] 杜拉拉升职记——14 猜猜为啥请晚餐
  20. linux下解压dmp文件怎么打开,查看dmp文件

热门文章

  1. SpringBoot笔记(二)
  2. 安装archlinux
  3. 【原创】packetbeat 之“request-response 错误关联”问题
  4. 在windows7上的通过composer安装yii2
  5. 实验报告一:词法分析
  6. 一篇很形象的文章,什么是数字签名?
  7. 为什么要设置Java环境变量(详解)
  8. c++如何对结构体作为形参设置默认值
  9. Win7系统下共享文件夹后共享文件夹上的小锁图标取消方法
  10. 【mDNS】本地DNS解析协议