码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java 一文详解二叉树的层序遍历


    1 前言

    在之前的文章《树的前中后序递归遍历》 和 《二叉树的统一迭代方法》 我们已经讲解了二叉树的前中后序的递归和迭代遍历方式。然而二叉树的前中后序遍历都是通过先深度搜索。有时候我们需要进行层间搜索。这样前中后序的遍历的缺点就显露出来了。

    2 实现

    以上图为例

    因为是层序遍历,我们需要思考假如我们有节点1,可以通过其左右子节点获得节点2和节点3,但是我们要保证节点2要比节点3先遍历。因此我们需要借助队列。

    • 首先,我们使用队列,将节点1装入其中。此时队列长度为1。
    • 然后循环遍历一次,将其左右子节点装入队列,此时队列长度为2。
    • 因此我们可以循环遍历2次,将左节点2的子节点装入队列,然后将右节点3的子节点装入队列,此时队列长度为4。
    • 直到队列为空为止。

    代码实现:

    1. package cn.msf.tree;
    2. import java.util.ArrayDeque;
    3. import java.util.ArrayList;
    4. import java.util.Deque;
    5. import java.util.List;
    6. /**
    7. * @author : msf
    8. * @date : 2022/12/5
    9. */
    10. public class LevelTraversal {
    11. public static void main(String[] args) {
    12. TreeNode root = new TreeNode(1);
    13. TreeNode node1 = new TreeNode(2);
    14. TreeNode node2 = new TreeNode(3);
    15. TreeNode node3 = new TreeNode(4);
    16. TreeNode node4 = new TreeNode(5);
    17. TreeNode node5 = new TreeNode(6);
    18. TreeNode node6 = new TreeNode(7);
    19. root.left = node1;
    20. root.right = node2;
    21. node1.left = node3;
    22. node1.right = node4;
    23. node2.left = node5;
    24. node2.right = node6;
    25. LevelTraversal levelTraversal = new LevelTraversal();
    26. List> result = levelTraversal.levelPrint(root);
    27. for (ArrayList arrayList : result) {
    28. System.out.println(arrayList);
    29. }
    30. }
    31. private List> levelPrint(TreeNode root) {
    32. if (root == null) {
    33. return null;
    34. }
    35. List> result = new ArrayList<>();
    36. Deque queue = new ArrayDeque<>();
    37. queue.push(root);
    38. while (!queue.isEmpty()) {
    39. int size = queue.size();
    40. ArrayList path = new ArrayList<>();
    41. for (int i = 0; i < size; i++) {
    42. TreeNode node = queue.pop();
    43. path.add(node.value);
    44. if (node.left != null) {
    45. queue.add(node.left);
    46. }
    47. if (node.right != null) {
    48. queue.add(node.right);
    49. }
    50. }
    51. result.add(path);
    52. }
    53. return result;
    54. }
    55. }

    上述代码执行结果:

     

  • 相关阅读:
    【Rust日报】2022-11-26 yew发布0.20
    05预测识别-依托YOLO V8进行训练模型的识别——对视频中的目标进行跟踪统计
    ocx 调用dll必须要将dll路径加到Path中 尽量用静态编译 用共享编译时需要把dll复制到system32下否则注册提示缺少dll
    阿里云2核2G服务器40G ESSD Entry系统盘99元性能测评
    Python的简单使用与应用
    网络安全(黑客)自学
    FPGA之旅设计99例之第十四例-----接收红外遥控数据
    深入解析Vue中的keep-alive组件:优化组件切换与DOM渲染!
    6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)
    解决Windows 10 家庭中文版没有组策略编辑器的问题
  • 原文地址:https://blog.csdn.net/abc123mma/article/details/128192898
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号