目录

  • 多级树的深度优先遍历与广度优先遍历(Java实现)

    • 节点模型
    • 深度优先遍历
    • 广度优先遍历

多级树的深度优先遍历与广度优先遍历(Java实现)

深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍历直接套用图结构的遍历方法即可。

工程中后端通常会用多级树来存储页面表单的各级联动类目,本文提供了深度遍历与广度遍历的示例,在使用时只要根据你的业务需求稍加改动即可。

我们知道,遍历有递归,非递归两种方式。在工程项目上,一般是禁用递归方式的,因为递归非常容易使得系统爆栈。同时,JVM也限制了最大递归数量,在你的树结构非常深的时候很容易出现StackOverflowError异常,所以最好采用非递归的方式。

节点模型

public class Node {//值public int value;//所有的子节点public ArrayList<Node> nexts;public Node(int value) {this.value = value;}
}

深度优先遍历

深度优先搜索英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。多级树可以看做一个特殊的图结构,总的来说遍历的方法还是不变的,都是利用栈和Set来进行操作。

主要步骤:

  1. 准备一个栈结构和一个Set结构的集合,栈用来记录还有孩子没有被遍历到的节点,Set用来记录遍历的历史记录
  2. 将首节点加入到栈和set中
  3. 弹栈拿到首节点
  4. 从首节点开始深度遍历,下面示例代码配合注解近进行理解。
public static void dfs(Node node) {if (node == null) {return;}Stack<Node> stack = new Stack<>();HashSet<Node> set = new HashSet<>();stack.add(node);set.add(node);System.out.println(node.value);while (!stack.isEmpty()) {//弹栈获得一个节点Node cur = stack.pop();//查看这个节点的所有孩子for (Node next : cur.nexts) {//如果有孩子是之前没有遍历到的,说明这个节点没有深度遍历完if (!set.contains(next)) {//此节点与其孩子加入栈与Set中stack.push(cur);stack.push(next);set.add(next);System.out.println(next.value);break;}}}
}

广度优先遍历

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。对于多级数来说,就是先遍历该节点的所有孩子,然后在遍历孩子节点的所有孩子,先遍历一层再遍历下一次层。

主要思路就是利用队列来将下一层的所有节点记录下来,然后顺序遍历就可以了。

public static void bfs(Node node) {if (node == null) {return;}Queue<Node> queue = new LinkedList<>();//用来注册已加入队列的节点——>防止重复添加节点HashSet<Node> set = new HashSet<>();queue.add(node);set.add(node);while (!queue.isEmpty()) {Node cur = queue.poll();System.out.println(cur.value);//将节点的所有下游节点加入到队列for (Node next : cur.nexts) {if (!set.contains(next)) {set.add(next);queue.add(next);}}}
}

转载于:https://www.cnblogs.com/keeya/p/11487465.html

多级树的深度优先遍历与广度优先遍历(Java实现)相关推荐

  1. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  2. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

  3. 二叉树的深度优先遍历和广度优先遍历

    二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...

  4. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  5. 大话数据结构 17:图的深度优先遍历和广度优先遍历

    深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...

  6. [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现

    [js] 解释下深度优先遍历和广度优先遍历的区别及如何实现 1.深度优先采用堆栈结构,先进后出,所占的空间较小,执行时间较长: 2.广度优先采用队列结构先进先出,所占空间较大,执行时间短,空间换时间: ...

  7. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  8. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  9. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

最新文章

  1. 都是程序员,凭什么他能站在鄙视链的顶端?
  2. 特定场景下SQL的优化
  3. 在dreamweaver mx中它只能对html文件可以进行编辑,【职称计算机考试网页制作历年试题及答案二】- 环球网校...
  4. mysql 性能分析 命令_MySQL中使用SHOW PROFILE命令分析性能的用法整理
  5. Outlook Express 错误代码表
  6. sql 整改措施 注入_SQL注入入侵防范措施
  7. 如何获取android源码
  8. MyBatis调用存储过程,含有返回结果集、return参数和output参数
  9. JAVA 基础算法汇总(持续更新)
  10. matlab int 求定积分
  11. 【论文笔记】Toward A Thousand Lights Decentralized Deep Reinforcement Learning for Large-Scale TSC...
  12. 某年的月初月末时间戳获取
  13. jzy3D从入门到弃坑_2使用jzy3D0.9画2D散点图
  14. 支付宝门店码,全面助力商家快速实现数字化经营
  15. 微擎上传图片失败——加密版本不能使用__DIR__或者__FILE__
  16. php silk文件转换pcm,微信语音silk格式文件转换处理记录
  17. MIPS指令集-mars-cpu
  18. 3a2b递归排列java,写点关于递归的话题(一)
  19. 国际化复数形式的支持与pygettext的补丁
  20. HDU5172 - GTY's gay friends - 哈希

热门文章

  1. Yii2.0 数据库更新update
  2. 云场景实践研究第34期:加和科技
  3. 关于querySelector 和 document.getElementsByTagName 选中集合问题
  4. 什么是OOA/OOD
  5. 【转】 linux iio子系统
  6. Codeforces Round #168 (Div. 2)D. Zero Tree(DP,中等难度)
  7. 旧闻 - 来怀念一下Sun公司
  8. 一次“炼狱”般的电脑维护
  9. 0016-Avro序列化反序列化和Spark读取Avro数据
  10. Spring Boot异常