算法的学习笔记---按之字形顺序打印二叉树

news2024/11/18 16:43:28

img

😀前言
在算法的学习中,二叉树是一种非常基础但又十分重要的数据结构。今天,我们将讨论一种特殊的二叉树遍历方法:之字形顺序打印。这个方法要求我们以“之”字形的顺序遍历并打印二叉树的节点值,也就是第一行从左到右,第二行从右到左,第三行再从左到右,以此类推。这种遍历方式不仅能加深我们对二叉树结构的理解,还能为某些特殊的实际应用提供算法支持。

🏠个人主页:尘觉主页

文章目录

  • 🥰按之字形顺序打印二叉树
    • 😊问题描述
      • 举例说明
    • 🤔解题思路
    • 😁代码实现
      • 代码解析
    • 😄总结

🥰按之字形顺序打印二叉树

😊问题描述

我们需要实现一个函数来完成这一任务。给定一个二叉树,我们要按之字形顺序遍历二叉树,并将每一层的节点值按要求的顺序保存下来,最后返回结果。

举例说明

假设我们有以下二叉树:

        1
       / \
      2   3
     / \ / \
    4  5 6  7

按之字形顺序打印的结果应该是:

[
 [1],
 [3, 2],
 [4, 5, 6, 7]
]

第一行按照从左到右的顺序打印:1;第二行按照从右到左的顺序打印:3, 2;第三行再按照从左到右的顺序打印:4, 5, 6, 7

🤔解题思路

为了实现这个功能,我们可以使用广度优先搜索(BFS)的方法,即层序遍历二叉树。具体来说,我们可以利用队列来保存当前层的节点,同时通过一个布尔变量来标记当前层的遍历方向。以下是详细的步骤:

  1. 初始化:创建一个队列用于层序遍历,并将根节点加入队列。创建一个结果列表用于保存每层的节点值。
  2. 遍历每一层
    • 对于当前层的每一个节点,从队列中取出并将其子节点(如果存在)加入队列。
    • 将当前节点的值保存到一个列表中。
    • 如果当前层需要反向打印(从右到左),则反转列表中的值。
  3. 切换遍历方向:在遍历完当前层之后,切换下一个层次的遍历方向。
  4. 返回结果:将每一层的节点值按顺序加入结果列表中并返回。

😁代码实现

以下是该算法的Java实现代码:

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(pRoot);
        boolean reverse = false; // 标记是否需要反向
        while (!queue.isEmpty()) {
            ArrayList<Integer> list = new ArrayList<>();
            int cnt = queue.size();
            while (cnt-- > 0) {
                TreeNode node = queue.poll();
                if (node == null)
                    continue;
                list.add(node.val);
                queue.add(node.left);
                queue.add(node.right);
            }
            if (reverse) // 如果当前层需要反向
                Collections.reverse(list);
            reverse = !reverse; // 切换遍历方向
            if (list.size() != 0)
                ret.add(list);
        }
        return ret;
    }
}

代码解析

  1. 队列的使用:队列是广度优先搜索的经典工具,利用它,我们可以逐层遍历二叉树。
  2. 反向操作:每遍历一层后,我们会检查当前是否需要反向打印,如果需要,则使用Collections.reverse()方法反转当前层的列表。
  3. 布尔变量切换方向:通过布尔变量reverse的切换,我们能轻松地控制下一层的遍历方向。

😄总结

之字形顺序打印二叉树是一种层序遍历的变种,它要求我们在遍历每层节点时,按指定的方向打印。这种问题不仅考察我们对二叉树遍历的掌握,还需要我们灵活运用数据结构来管理遍历的顺序。通过上述代码,我们可以高效地实现这一功能,并在复杂的树结构中应用。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

开放式耳机别人能听到吗?现在开放式耳机用防漏音效果越来越好!

回答&#xff1a; 开放式耳机的通透的设计允许一部分声音泄露出来&#xff0c;因此站在您旁边的人确实有可能听到您耳机中的声音&#xff0c;尤其是当音量设置得比较高时。开放式耳机通常提供更为自然和宽敞的听感&#xff0c;但牺牲了一定的隔音效果和隐私性。如果您需要在公…

台球助教在线预约小程序源码开发:打造便捷高效的台球学习新体验

在当今快节奏的生活中&#xff0c;台球作为一项集休闲、竞技与社交于一体的运动&#xff0c;受到了越来越多人的喜爱。然而&#xff0c;对于初学者而言&#xff0c;想要快速提升技能&#xff0c;往往需要专业的指导和陪练。传统的台球教练预约方式往往存在信息不对称、预约流程…

Qt实现圆型控件的三种方法之子类化控件并重写paintEvent

前言 最近在研究绘制各种形状的控件&#xff0c;这里专门挑出圆形的控件进行记录&#xff0c;其它形状的也大差不差&#xff0c;会了圆形的之后其它的也类似。 正文 这里我挑出Label来进行举例。 子类化 QLabel 并重写 paintEvent 如果需要更复杂的自定义绘制&#xff0c;…

医疗器械维修技术——开启成功之门的钥匙

随着现代医疗科技的飞速发展&#xff0c;医疗器械的精密程度和复杂性与日俱增。这些高科技的医疗设备&#xff0c;不仅是医生诊断和治疗疾病的得力助手&#xff0c;更是患者重获健康的希望之光。然而&#xff0c;如同任何复杂的机器一样&#xff0c;医疗器械也难免会出现故障和…

DRF——视图类的继承关系功能梳理(APIView,GenericAPIView,GenericViewSet,五大mixin类,)

文章目录 视图APIViewGenericAPIView&#xff08;将数据库查询、序列化类的定义提取到类变量&#xff09;GenericViewSet&#xff08;继承ViewSetMixin和GenericAPIView&#xff09;五大类&#xff08;List,Create,Retrieve,Update,Destory&#xff09;ModelViewSet&#xff08…

【网络安全】15种常见网络攻击类型及防御措施_

随着攻击者效率和复杂性的提高&#xff0c;网络犯罪每年都在急剧增加。网络攻击的发生有多种不同的原因和多种不同的方式。但是&#xff0c;一个共同点是网络犯罪分子会寻求利用组织的安全策略、实践或技术中的漏洞。 什么是网络攻击&#xff1f; 网络攻击是指攻击者出于盗窃…

页面设计任务 个人网站页面

目录 成品: 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.导航栏部分 2.主页样式部分 3.关于我部分 4.作品集部分 5.联系我部分 6.页脚部分 成品: 任务描述 创建一个个人网站&#xff0c;包含以下部分&#xff1a; 顶部导航栏&#xff1a;包含多个链接&#…

数字人直播软件开发技术有哪些?一文教你摸透行情!

当前&#xff0c;开发数字人直播软件已经成为数字人赛道的重要入局方式&#xff0c;与之相关的数字人直播软件开发技术有哪些等话题的讨论的更是随着时间的推移不断攀升。毕竟&#xff0c;对于创业者而言&#xff0c;不管是打算自行开发&#xff0c;还是选择寻求数字人源码厂商…

微积分-定积分4.5(换元法则)

由于基本定理&#xff08;Fundamental Theorem of Calculus&#xff09;的缘故&#xff0c;能够找到反导函数&#xff08;即反微分&#xff09;是非常重要的。但我们现有的反导函数公式并没有告诉我们如何计算类似以下形式的积分&#xff1a; ( 1 ) ∫ 2 x 1 x 2 d x (1) \qua…

神经网络算法 - 一文搞懂BERT(基于Transformer的双向编码器)

本文将从BERT的本质、BERT的原理、BERT的应用三个方面&#xff0c;带您一文搞懂Bidirectional Encoder Representations from Transformers | BERT。 Google BERT BERT架构&#xff1a; 一种基于多层Transformer编码器的预训练语言模型&#xff0c;通过结合Tokenization、多种E…

贪心算法-最大容量问题

最大容量问题的贪心解法 目录 最大容量问题的贪心解法问题描述问题分析贪心策略代码实现&#xff08;C&#xff09;总结C学习资源 问题描述 给定一个数组ht&#xff0c;其中的每个元素代表一个垂直隔板的高度。我们可以通过任意两个隔板以及它们之间的空间来组成一个容器。容器…

PostgreSQL16.1(Linux版本离线下载)

1、将数据库压缩包和对应的依赖包上传到对应的目录下。 2、解压数据库文件。 3、解压libicu依赖文件,有两个看对应的版本能装上去即可。 4、进入解压数据库文件的该目录后执行此命令: ./configure --prefix=/usr/local/pgsql 5、输入“make && make install”命令,…

SQL-DCL-数据控制语言

一、 DCL-管理用户 二、DCL-权限控制 一、 DCL-管理用户,主要是DBA数据库管理员使用&#xff0c;开发使用较少 # 1、查询用户 use mysql; show tables; desc user; select * from user; # host为主机地址, 主机地址和用户名确定唯一性# 2、创建用户 create user itcastlocalh…

有哪些好用的文献翻译器推荐?中英文文献翻译软件一览

在平时的生活中&#xff0c;我常常需要阅读一些中英文的文献资料。面对那些生涩难懂的专业术语和复杂的句式结构&#xff0c;我时常感到头疼。 幸运的是&#xff0c;有了中英文文献翻译软件&#xff0c;我的阅读之旅变得轻松了许多。这些软件就像是我的语言助手&#xff0c;帮…

<数据集>航拍牧场奶牛识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1805张 标注数量(xml文件个数)&#xff1a;1805 标注数量(txt文件个数)&#xff1a;1805 标注类别数&#xff1a;1 标注类别名称&#xff1a;[cow] 序号类别名称图片数框数1cow1805141337 使用标注工具&#xff…

黑神话悟空无法登录服务器怎么办

黑神话悟空游戏在登录的时候会遇到无法登录服务器的问题&#xff0c;玩家可以采用一些有效的方法进行解决&#xff0c;其中最主要的措施就是优化网络环境和减少网络干扰。Rak小编为您整理黑神话悟空无法登录服务器如何解决的步骤及注意事项。 优化网络环境 1、当游戏无法登录服…

Android Compose 下拉选择框 ExposedDropdownMenu下拉选择

/*** author 创建人&#xff1a;蒙石瑞* date 创建时间&#xff1a;2024/8/23 10:57* Description 创建内容&#xff1a;下拉选择框*/ OptIn(ExperimentalMaterial3Api::class) Composable fun CustomExposedDropdownMenu(options: List<out DropdownMenuDes>,l…

LLM大模型GPT4o

看图&#xff01; 看图&#xff01; 预训练与微调是现代深度学习模型&#xff0c;特别是自然语言处理模型&#xff0c;常用的两个阶段。 预训练&#xff1a; 在这个阶段&#xff0c;模型在大量的广泛文本数据上进行训练&#xff0c;学习语言的基本结构、语法、词汇和上下文关…

解决使用uniapp时,uni.switchTab跳转标签页面不刷新的问题

我们在使用uni.switchTab跳转到标签页面时&#xff0c;并不会触发这个标签页面的onLoad方法。这是因为在 uni-app中&#xff0c;uni.switchTab用于跳转到指定的标签&#xff08;tab&#xff09;页面。由于标签页面是单实例的&#xff0c;即无论何时切换到该标签页面&#xff0c…

Java二十三种设计模式-解释器模式(23/23)

本文深入探讨了解释器模式&#xff0c;这是一种行为设计模式&#xff0c;用于构建和解释执行自定义语言&#xff0c;提供了实现方法、优点、缺点、与其他模式的比较、最佳实践和替代方案的全面分析&#xff0c;帮助开发者在实际应用中做出明智的设计选择。 解释器模式&#xff…