深度优先和广度优先

文章目录

  • 前言
  • 一、深度和广度的区别
  • 二、代码演示
    • 1.准备数据,构造树
    • 2.深度优先遍历
    • 3.广度优先遍历
  • 总结


前言

深度优先和广度优先的区别:

  1. 搜索方式不同 。深度优先搜索算法不全部保留结点,扩展完的结点从数据库中弹出删去;广度优先搜索算法需存储产生的所有结点。
  2. 运行速度不同 。深度优先搜索算法有回溯操作,运行速度慢;广度优先搜索算法无回溯操作,运行速度快。
  3. 占用空间不同 。深度优先搜索算法占用空间少;广度优先搜索算法占用空间大。
  4. 作用不同。虽然都可以完成树形结构的遍历,但是深度优先一般用于需要先处理最深层级逻辑,广度优先一般用于层层节点展开的处理逻辑;

一、深度和广度的区别

一颗树

  • 深度优先: 1>3>7>6>2>5>4
  • 广度优先: 1>2>3>4>5>6>7

二、代码演示

1.准备数据,构造树

代码如下(示例):

public class MainUtil2 {public static void main(String[] args) throws Exception {// 获取demo 数据List<AuthMenuTree> list = getList();// 变为树List<AuthMenuTree> res = getChildrenStream(0, list);System.out.println(JSONUtil.toJsonStr(res));}private static List<AuthMenuTree> getChildrenStream(int i, List<AuthMenuTree> list) {return list.stream().filter(authMenuTree -> authMenuTree.getMenuPid() == i).peek(authMenuTree -> authMenuTree.setChildren(getChildrenStream(authMenuTree.getId(), list))).collect(Collectors.toList());}public static List<AuthMenuTree> getList() {List<AuthMenuTree> objects = CollectionUtil.newArrayList();objects.add(new AuthMenuTree(0, 1));objects.add(new AuthMenuTree(1, 2));objects.add(new AuthMenuTree(1, 3));objects.add(new AuthMenuTree(2, 4));objects.add(new AuthMenuTree(2, 5));objects.add(new AuthMenuTree(3, 6));objects.add(new AuthMenuTree(3, 7));return objects;}}

2.深度优先遍历

代码如下(示例):

    public static void main(String[] args) throws Exception {// 获取demo 数据List<AuthMenuTree> list = getList();// 变为树List<AuthMenuTree> res = getChildrenStream(0, list);List<String> result = new ArrayList<>(res.size());AuthMenuTree root = res.get(0);// 深度优先 用栈Stack<AuthMenuTree> stack = new Stack<>();AuthMenuTree head;// 入栈stack.add(root);// 出栈while (!stack.isEmpty() && (head = stack.pop()) != null) {if (!ObjectUtils.isEmpty(head.getChildren())) {// 子类入栈stack.addAll(head.getChildren());}// 添加到顺序结果集中result.add(head.getId().toString());}System.out.println(JSONUtil.toJsonStr(result));}

打印结果: [“1”,“3”,“7”,“6”,“2”,“5”,“4”]

3.广度优先遍历

代码如下(示例):

    public static void main(String[] args) throws Exception {// 获取demo 数据List<AuthMenuTree> list = getList();// 变为树List<AuthMenuTree> res = getChildrenStream(0, list);List<String> result = new ArrayList<>(res.size());AuthMenuTree root = res.get(0);// 广度优先 用队列Queue<AuthMenuTree> treeQueue = new LinkedList<>();AuthMenuTree head;treeQueue.offer(root);while ((!treeQueue.isEmpty()) && (head = treeQueue.poll()) != null) {if (!ObjectUtils.isEmpty(head.getChildren())) {treeQueue.addAll(head.getChildren());}result.add(head.getId().toString());}System.out.println(JSONUtil.toJsonStr(result));}

打印结果: [“1”,“2”,“3”,“4”,“5”,“6”,“7”]


总结

深度优先 用栈;广度优先 用队列;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle-sga-shared_pool

shared pool 缓冲sql语句和执行计划 shared pool由三部分组成 free libray&#xff1a;缓存sql执行计划 row cathe &#xff1a;缓存数据字典 硬解析&#xff1a;1判断语法2判断对象是否存在3有没有权限4 从n个执行方案中选出最优解&#xff0c;生成执行计划&#xff0c;这一…

壮志酬筹>业务被裁>副业转正>收入回正。一个前黑马程序员老师的2023

从年初时的踌躇满志&#xff0c;到年中时整个业务线被砍。全职做前端训练营&#xff0c;四个多月的时间帮助100多名同学拿到了满意的offer&#xff0c;同时也让我的收入重归正轨。仅以这个视频记录我&#xff0c;一个普通程序员的 2023 。 视频版可直接访问 Hello&#xff0c;大…

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

JavaScript:正则表达式

JavaScript&#xff1a;正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法&#xff0c;…

2023 搞懂git 工作目录---暂存区---本地仓库---版本库

最近了解了下git的底层原理&#xff08;大神录制的视频放在最下方&#xff09;&#xff0c;记录下&#xff1a; 工作区 就是存放待提交文件的目录&#xff08;下图图解标注&#xff09;比如pyhon_test目录暂存区 .git目录下的index文件 对应的指令 git add本地仓库 .gi…

图片格式 WebP、JPEG、PNG、SVG 及转换

文章目录 图片格式 WebP、JPEG、PNG、SVG 及转换1. 图片格式1.1 WebP1.2 JPEG1.3 PNG1.4 SVG1.5 ... 2. 格式转换2.1 Python 批量转 WebP2.2 在线转换工具2.2.1 Shutterstock2.2.2 PicWish2.2.3 MyEdit2.2.4 Freeconvert2.2.5 iLoveIMG Reference 图片格式 WebP、JPEG、PNG、SV…

数据压缩专题——静止图像的小波变换编码

随着数字图像技术的发展和应用的广泛&#xff0c;对图像的压缩和编码变得越来越重要。小波变换编码作为一种有效的图像压缩和编码方法&#xff0c;在静止图像处理中得到了广泛应用。本文将介绍静止图像的小波变换编码的基本原理和关键步骤&#xff0c;以及其在图像压缩中的应用…

nginx+keepalived实现七层负载

目录 一、部署nginx01、nginx02 二、keepalived配置&#xff08;抢占模式、master- backup模式&#xff09; 三、测试 四、非抢占模式&#xff08;backup-backup模式&#xff09; nginx01 11.0.1.31nginx0211.0.1.32虚拟IP&#xff08;VIP&#xff09;11.0.1.30 一、部署ngin…

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…

Large-Precision Sign using PBS

参考文献&#xff1a; [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the T…

Observer观察者模式(组件协作)

观察者模式&#xff08;组件协作&#xff09; 链接&#xff1a;观察者模式实例代码 解析 目的 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系” ——一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff0…

UI演示双视图立体匹配与重建

相关文章&#xff1a; PyQt5和Qt designer的详细安装教程&#xff1a;https://blog.csdn.net/qq_43811536/article/details/135185233?spm1001.2014.3001.5501Qt designer界面和所有组件功能的详细介绍&#xff1a;https://blog.csdn.net/qq_43811536/article/details/1351868…

MySQL 执行过程

MySQL 的执行流程也确实是一个复杂的过程&#xff0c;它涉及多个组件的协同工作&#xff0c;故而在面试或者工作的过程中很容易陷入迷惑和误区。 MySQL 执行过程 本篇将以 MySQL 常见的 InnoDB 存储引擎为例&#xff0c;为大家详细介绍 SQL 语句的执行流程。从连接器开始&…

Spring基础IoC(控制反转)与DI(依赖注入)

1. Spring 基础 1.1 什么是Spring框架&#xff1f;它能带来那些好处&#xff1f; Spring 是一个开源的轻量级的 Java 开发框架&#xff0c;可以帮助开发人员更高效的进行开发&#xff0c;主要优势在于简化开发和框架整合。 Spring框架整合了很多模块&#xff0c;这些模块可以…

LeetCode 刷题日志

文章目录 1954. 收集足够苹果的最小花园周长思考&#xff1a;暴力枚举代码实现二分查找代码实现 1954. 收集足够苹果的最小花园周长 1954. 收集足够苹果的最小花园周长 难度&#xff1a; 中等 题目大意&#xff1a; 给你一个用无限二维网格表示的花园&#xff0c;每一个 整…

Matplotlib ------ 纵坐标科学计数法含义

matplotlib 纵坐标科学计数法含义 引言正文 引言 今天画图时遇到了一个问题&#xff0c;发现纵坐标是科学计数法的表示&#xff0c;但是很难理解它的含义&#xff0c;这里特来记录一下。 正文 我们以下图为例&#xff0c; 由图上我们可以看出&#xff0c;纵坐标显示为 1e-…

PHP序列化总结3--反序列化的简单利用及案例分析

反序列化中生成对象里面的值&#xff0c;是由反序列化里面的值决定&#xff0c;与原类中预定义的值的值无关&#xff0c;穷反序列化的对象可以使用类中的变量和方法 案例分析 反序列化中的值可以覆盖原类中的值 我们创建一个对象&#xff0c;对象创建的时候触发了construct方…

纯CSS3制作优惠券线性UI效果

纯CSS3制作优惠券线性UI效果-遇见你与你分享

《分布式事务理论基础:CAP定理 BASE理论》

目录 学习目标 1.分布式事务理论基础 1.1.本地事务 1.2.分布式事务 分布式事务产生的原因&#xff1f; 哪些场景会产生分布式事务&#xff1f; 单体系统会产生分布式事务问题吗&#xff1f; 只有一个库&#xff0c;会产生分布式事务问题吗&#xff1f; 分布式事务举…

rax3000m刷openwrt固件

rax3000m刷机过程&#xff08;nand版本&#xff09; 刷机准备文件https://www.123pan.com/s/X5m9-6Ynj.html提取码:VtBW 接线关系&#xff1a;路由器lan口接电脑 1.上传配置开启ssh的配置文件&#xff08;登录路由器后台管理界面在找到配置管理&#xff0c;上传配置文件rax3…