java - 广度优先搜索 - 遍历树 - 持续更新

java算法系列,第十五篇:二叉树深度(&广度)优先遍历 这个后序遍历稍微麻烦一点,因为探索完右子树还要找回去的路,所以不能直接把父节点在回去的过程中给弹出了,得先查看它还有没有右子树,如果没有,那直接弹出没关系,如果有,那就先探索完右子树再回来看一下,如果当前节点的右子树已经确认被弹出了,再弹出当前节点;中序就是先遍历完了左子树,没有节点了,再从栈弹出左子树,父节点;前序就先输出父节点,然后把父节点压入栈,再去探索左节点,什么时候没有节点了,探索右节点。当然,这里的LinkedListStack类是我自己写的一个实现栈的类,前面。是指父节点的输出顺序。 阅读详情

目录

广度优先搜索算法(Breadth-First Search,BFS)

1、递归实现BFS遍历树

2、非递归实现BFS遍历树


树的定义参见:

https://blog.youkuaiyun.com/Longtermevolution/article/details/105395558


广度优先搜索算法(Breadth-First Search,BFS)

BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。

 

1、递归实现BFS遍历树

public static <V> void bfs(List<TreeNode<V>> children, int depth) {
    List<TreeNode<V>> thisChildren, allChildren = new ArrayList<>();
    for (TreeNode<V> child: children) {
        //打印节点值以及深度
        System.out.println(child.getValue().toString() + ",   " + depth);
        thisChildren = child.getChildList();
        if (thisChildren != null && thisChildren.size() > 0) {
            allChildren.addAll(thisChildren);
        }
    }
    if (allChildren.size() > 0)  {
        bfs(allChildren, depth + 1);
    }
}

 

自己想了好久没想出来,最后还是在网上搜到的算法。

 


2、非递归实现BFS遍历树

public static <V> void bfsNotRecursive(TreeNode<V> tree) {
    if (tree != null) {
        //使用 Map 也只是为了保存树的深度,没这个需要可以不用 Map
        Queue<Map<TreeNode<V>, Integer>> queue = new ArrayDeque<>();
        Map<TreeNode<V>, Integer> root = new HashMap<>();
        root.put(tree, 0);
        queue.offer(root);
        while (!queue.isEmpty()) {
            Map<TreeNode<V>, Integer> itemMap = queue.poll();
            TreeNode<V> itemTreeNode = itemMap.keySet().iterator().next();
            int depth = itemMap.get(itemTreeNode);
            //打印节点值以及深度
            System.out.println(itemTreeNode.getValue().toString() + ",   " + depth);
            if (itemTreeNode.getChildList() != null &&
                    !itemTreeNode.getChildList().isEmpty()) {
                for (TreeNode<V> child : itemTreeNode.getChildList()) {
                    Map<TreeNode<V>, Integer> map = new HashMap<>();
                    map.put(child, depth + 1);
                    queue.offer(map);
                }
            }
        }
    }
}

相比较而言,非递归实现就比较简单了。可以看到非递归实现有个问题就是无法遍历根节点,不过问题不大,而且我也还没想出来其他更优雅的办法来实现。

华为OD机试 - 获取二叉树第k层的数值 - 广度优先搜索 BFS(Python/JS/C/C++ 新系统 200分) 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一棵节点数为 n 的二叉树,树中每个节点均有一个节点编号和整型取值,节点编号取值 0 到 n − 1,根节点所在层为第 0 层,其子 节点为第 1 层,以此类推。已知节点取值以及节点父子关系,请返回第 k 层节点取值列表,按升序排列并去重。• 阅读详情

相关推荐

Java实现利用广度优先遍历(BFS)计算最短路径的方法

主要介绍了Java实现利用广度优先遍历(BFS)计算最短路径的方法,实例分析了广度优先遍历算法的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

图的广度优先遍历(Java实现)

文章收藏的好句子:这个世上,没有天上掉馅饼的灵感和等来的成就,只有日复一日的坚持和自律。目录1、图的广度优先遍历 1、1 图的广度优先遍历基本思想 1、2图的广度优先遍历算法步骤 1、3图的广度优先遍历代码实现1、图的广度优先遍历1、1 图的广度优先遍历基本思想在图的表现形式第一篇(Java实现)这篇文章中,我们学习了图的深度优先遍历,这篇文章...

qq_37837621的博客 4118

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 262

Java实现图的深度优先遍历和广度优先遍历,深度广度优先遍历详解

邻接矩阵实现图,Java实现数据结构,Java实现图的深度优先遍历,广度优先遍历

3018

Enterprise Architect 中文经典教程

本文使用到的EA工程文件下载 一、Enterprise Architect简介 Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件(Computer Aided Software Engineering)。EA不同于普通的UML画图工具(如VISIO),它将支撑系统开发的全过程。在需求分析阶段,系统分析与设计阶段,系统开发及部署等方面有着强大的支持,...

2万+

【开源数据集】电动车佩戴头盔检测数据集(TWHD)

佩戴头盔检测数据集VOC格式图像与标注数量各5448张

hzg19930513的博客 5170

图的深度优先遍历和广度优先遍历(java)

利用点线的组合来实现图的结构,优势就是结构清晰,容易理解,表达的数据项多。便于很多图的算法。具体实现可以查看上期连接自定义图结构自定义图结构的代码/*** 线/*** 线的权重/*** 这个是点的结构 先理解为头节点/*** 理解为尾节点或者出节点。} } /*** 点的数据结构//出度 public int out;//入度 public int in;//边的集合(这个点的所有线段集合) public ArrayList < Edge > edges;

SP_1024的博客 528

单卡调试OpenGait:从分布式到本地的轻量级改造指南

本文为个人开发者和研究者提供了一份详细的OpenGait框架单卡调试指南。针对该框架默认依赖多GPU分布式训练的问题,文章通过分析核心痛点,逐步讲解了如何从环境搭建、绕过分布式初始化陷阱、处理通信后端报错到最终配置与调试,实现从分布式到本地的轻量级改造,帮助读者在单张GPU上高效进行步态识别模型的验证与学习。

weixin_28223453的博客 139

BFS (Java) 广度优先搜索 简单介绍、模板、案例(一)

深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法,在各类题目中都有广泛的应用。 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。 广度优先搜索算法(Breadth-First Search,缩写为 BFS),又称为宽度优先搜索,是一种图形搜索算法。简单的说,BFS 是从根结点开始,沿着树的宽度遍历树的结点。如果所有结点均被

weixin_45532984的博客 4292

【置顶】TEE从入门到精通-[目录]

此专栏讲解包含不限于optee、商用TEE、常规的安全业务设计。但主要基于optee最新代码,深度讲解和剖析各项原理和机制...

baron-周贺贺-代码改变世界ctw 6427

Intellij IDEA 使用教程(一)Jdk安装和配置

一.JDK下载 这里下载的是Java SE 8u181 64位版本。可以根据自己电脑配置来选择不同版本。 官网下载JDK 二.安装JDK 双击运行jdk-8u181-windows-x64.exe安装程序 选择安装目录,然后点击下一步 等待安装 安装JRE,就是java的运行环境,可以安装在java目录下 等待安装 安装完成。点击关闭。 三.java环境变量配置 关于环境变量的配置,...

岁月不饶人,我亦未曾饶过岁月 4055

理解广度优先遍历(持续更新)

广度优先搜索(BFS) 如何理解广度优先搜索:如果对广度优先遍历没有一点点了解的同学建议先去看看树的层次遍历,其实这就是广度优先搜索的一个应用,层次遍历的大致思路就是:将二叉树按从上往下。从左往右逐层遍历二叉树;广度优先搜索其实也是这个思路,解题时关键就是看你在这个过程中需要做些什么; 如何实现广度优先搜索: 我们直到其实深度优先搜索是利用了栈的这个结构,所以我i们也可以利用递归实现深度优先搜索,而广度优先搜索是利用了队列这个结构,因为本人比较喜欢使用java语言所以我实现广度优先搜索一般就使用java自带

莞工杰仔的博客 2979

国科大学习资料--高级软件工程-复习题概念解释答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题概念解释答案 1. 敏捷开发方法与Scrum方法 a.敏捷是一种强调轻量的过程方法论,它强调拥抱变化而不是与之对抗,通过有效的沟通发挥群体的智慧。敏捷方法采用迭代/增量开发的过程模型。敏捷宣言是:个体和交互高于流程和工具;工作的软件高于详尽的文档;客户合作高于合同谈判;响应变化高于遵循计划。 虽然右边的也有价值,但是认为左边的更有价值。 b.Scrum(Schwaber和Beedle)是管理两个披萨规模(4-9人)的软件开发团队的方法,它高频率的短会

无名何许人的博客 1444

JAVA数据结构----实现图广度优先遍历与深度优先遍历

数据结构系列是我学习做的笔记,会持续更新,源码分享在github:数据结构,当然你也可以从下面的代码片中获取 注:github代码更新会有延迟,关注不迷路???? 本篇博文简单介绍图广度优先搜索算法与深度优先搜索算法,并用java实现 1. 广度优先搜索 教科书上解释:广度优先搜索类似于类似于树的层次遍历,是数的层次遍历的推广 算法描述: 从图中某个顶点v开始,先访问该顶点,再依此访问该顶点的每一个未被...

baidu_41860619的博客 453

保姆级教程:一步步创建 ABAP Text Table

有朋友反馈,问有没有一个自己动手创建 Text Table 的例子,因为自己没有动手实践过,总觉得心里不踏实。这个行为的语义是,ZAI_TYPE_T 这张表的 AI_TYPE 字段值,不能随便维护,必须是表。然后另一个需要添加的字段是 AI_TYPE 这个字段值对应的文本值,本例笔者采用 SAP 标准的。也是自己创建的,很简单的一个 Data Element,类型为 CHAR,长度为 2.依次给主表的 01,02,03 三个字段值维护对应的描述信息,最后效果如下。按照下面的字段结构,创建另一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4276

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

五月刷题17——广度优先搜索

广度优先搜索

MYuertt9的博客 170

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java算法总结持续更新(附常见算法题代码实现)

1、如何判断程序的复杂程度:时间和空间复杂度 https://blog.youkuaiyun.com/wang_8101/article/details/109017857 2、动态规划算法 https://blog.youkuaiyun.com/p10010/article/details/50196211 2.1动态规划基本概念与思想 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 基本思想与分治...

qq_40419964的博客 2257

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

玩转图论算法(5)图的广度优先遍历【Java实现】

5-1 图的广度优先思想 广度优先搜索(BFS,Breadth First Search)是一个分层的搜索过程,没有回退过程,是非递归的。 BFS 算法的思想是:对一个无向连通图,在访问图中某一起始顶点 v 后,由 v 出发,依次访问 v 的所有未访问过的邻接顶点 w1, w2, w3, …wt;然后再顺序访问 w1, w2, w3, …wt的所有还未访问过的...

mike_jun的博客 476

java数据结构----图的遍历应用举例:编程实现应用广度优先搜索算法确定无向图的连通分量

数据结构系列是我学习做的笔记,会持续更新,源码分享在github:数据结构,当然你也可以从下面的代码片中获取 注:github代码更新会有延迟,关注不迷路???? 图的遍历应用举例1 题目:编程实现应用广度优先搜索算法确定无向图的连通分量,即:图有几个互不相连的部分 其中,涉及到:接口 IGraph 和类 MGraph 详见博文图的存储结构之邻接矩阵 当然也可以访问我的github,获取完整项目代码(注...

baidu_41860619的博客 723

算法刷题记录——LeetCode篇(3.3) [第221~230题](持续更新)

LeetCode221-230个人刷题总结。

weixin_42826353的博客 633

【力扣题解】P513-找树左下角的值-Java题解

【力扣题解】P513-找树左下角的值-Java题解

@花无缺 1029

LeetCode算法技巧汇总 -- 持续更新,学无止境!

此篇是本人 LeetCode 算法刷题技巧总结,还包括刷过的算法题分类,自己记录以便后续二刷三刷,也分享给大家欢迎一起交流探讨。话说现在非常遗憾大学期间没能坚持搞 ACM,出来社会才越发觉得后悔,但是遗憾归遗憾,我还是相信种一棵树是十年前,其次是现在,所以重新再来为时不晚!刷起!!!

技术分享,读书笔记,面试宝典,算法积累,应有尽有~ 3104

搜索和遍历在图中有何区别和联系?

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来目录:部分内容截图:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-f3vBV9M2-1713706042432)]

2401_84049061的博客 1029

算法及数据结构知识点总结(持续更新)

目录 数据结构基础概念 链表 数组 栈 队列 哈希表 堆 二叉查找树 树 图 排序 冒泡排序 选择排序 插入排序 堆排序 归并排序 快速排序(重点) 查找 线性查找 二分查找 图的搜索 广度优先搜索 深度优先搜索 Bellman-Ford Dijkstra 机器学习 监督非监督 k-means apriori算法(关联分析) 支持向量机 ...

jhp1266987的博客 1119

算法学习笔记 4-3 深搜(DFS)与广搜(BFS):初识问题状态空间 与 LeetCode真题(Java)

4-3 深搜(DFS)与广搜(BFS):初识问题状态空间 搜索的核心概念 首先给大家拓展一个概念,这个概念就是我们学习搜索算法中非常重要的一环: 这个问题求解树是一个抽象的概念,是在我们自己脑海中根据问题所展开的一个树,也叫递归搜索树,状态展开树。 现在大家对这个树肯定还是一片朦胧,我们根据具体的例子来讲解一下:

How many ten years in the life time? 1799

算法刷题记录——LeetCode篇(2.1) [第101~110题](持续更新)

LeetCode101-110个人刷题总结。

weixin_42826353的博客 1050
上一篇: java实现-深度优先搜索
下一篇: 数据结构和算法导航
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值