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

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 995

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

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

3018

SAP FI模块实操:用F-28和F-32搞定客户回款与手动清账,别再让未清项报表一团糟

本文详细解析了SAP FI模块中F-28和F-32事务代码在客户回款与手动清账中的实操应用,帮助财务人员高效管理未清项报表。通过标准清账六步法和手动清账实战技巧,解决因操作不规范导致的账务混乱问题,提升应收账款管理效率。

weixin_30292843的博客 453

华为Atlas 300I推理卡驱动安装全攻略:从环境检查到常见问题解决

本文提供了华为Atlas 300I推理卡驱动安装的完整实战指南。从安装前的系统环境检查、内核版本匹配,到详细的二进制.run文件安装步骤、源码编译及高级定制化部署,涵盖了驱动安装的全流程。文章重点解析了安装过程中的关键决策、常见问题排查与解决方案,并针对生产环境的多卡配置、性能调优及安全加固给出了专业建议,旨在帮助用户高效、稳定地完成AI推理加速卡的部署。

swift5iosmith的博客 628

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

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

SP_1024的博客 528

Arduino跑通ssd1306_spi显示屏

代码首先,您需要下载两个库:● Adafruit GFX库,这是核心图形库,提供了一组通用的图形基元(点、线、圆等)。它需要与特定于硬件的库对应。● Adafruit SSD-1306 OLED显示库,这是基于SSD1306驱动程序的OLED显示器的库。解压缩这两个库并将它们添加到Arduino库文件夹中,然后运行Arduino IDE并从OLED库中打开SPI示例。

Leo ICer的博客 1494

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

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

weixin_45532984的博客 4292

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1005

k最近邻算法——电影分类及案例详解

如图3-7所示,若将国际象棋棋盘放在二维直角坐标系中,格子的边长定义为1,坐标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此切比雪夫距离也称为棋盘距离。关于这里的距离度量,这个电影分类的例子有2个特征,也就是2维的,可以使用我们高中学过的两点距离公式(两点距离公式其实就是欧氏距离在二维空间上的公式,也就是欧氏距离n的值为2的情况,欧氏距离也称为欧几里德距离)来计算距离,如图3-3所示。对数据进行归一化,避免量纲对计算距离的影响。

ZhShy 4558

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

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

莞工杰仔的博客 2979

利用SIMULINK搭建一个16QAM调制解调收发系统

1发送模块设计 根据前面介绍的理论知识,我们可以知道16QAM的基本结构,首先我来设计QAM发送段的SIMULINK仿真模块。 图1 16QAM的发送端模块 他的基本工作流程为:将信号通过两路升余弦滤波器,得到滤波以后的信号,滤波器的作用就是为了防止码间干扰。然后将滤波以后的信号和SIN,COS相乘得到调制信号,将调制 下面一一介绍每个模块的具体参数设置以及各个部分信号的波形图。 图2 产生随机数据的信号源 第一部分信号是产生一组随机的数字,作为信源,第二个模块将信号...

FPGA/MATLAB学习教程/源码/项目合作开发 4776

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

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

baidu_41860619的博客 453

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

广度优先搜索

MYuertt9的博客 170

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

玩转图论算法(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、付费专栏及课程。

余额充值