Leetcode 二叉树的锯齿形层序遍历

在这里插入图片描述

算法思想:

这段代码实现了 二叉树的锯齿形层序遍历,其核心思想是基于广度优先搜索(BFS)进行层序遍历,并根据当前层数决定从左到右或从右到左的顺序来组织每一层的节点值。

level.addlevel.addFirst 有点类似单链表的头插法和尾插法

详细步骤:
  1. 树节点定义
    定义了一个 TreeNode 类来表示二叉树的节点,每个节点包含:

    • val:节点的值
    • left:左子节点
    • right:右子节点
  2. 主算法逻辑

    • 定义了一个 zigzagLevelOrder 方法,用来执行锯齿形层序遍历。
    • 输入:二叉树的根节点 root
    • 输出:一个嵌套的列表 List<List<Integer>>,表示每一层的节点值,按照锯齿形排列。
  3. 初始化

    • 如果 root 为空,直接返回空列表。
    • 创建一个 Queue(队列)用来辅助进行层序遍历,并将根节点入队。
    • 定义一个布尔变量 leftToRight,初始为 true,用来表示当前层是否按从左到右的顺序进行。
  4. 按层遍历(循环处理每一层)

    • 在队列不为空的情况下,每次处理一整层的节点:
      • 获取当前层的节点数 size(队列长度)。
      • 创建一个 LinkedList 来存储当前层的节点值。
      • 遍历当前层的所有节点:
        • 从队列中取出节点。
        • 如果是从左到右(leftToRighttrue),直接将节点值追加到列表末尾。
        • 如果是从右到左,将节点值插入到列表头部(通过 addFirst 方法实现)。
        • 将当前节点的左右子节点(如果存在)加入队列,供下一层遍历使用。
    • 将当前层的列表加入最终结果 result
    • 翻转布尔变量 leftToRight,切换到下一层的遍历顺序。
  5. 返回结果

    • 最后返回 result,包含每一层的节点值。
核心优化点:
  • 锯齿形插入
    • 通过 LinkedListaddaddFirst 方法灵活控制节点值的插入顺序,而无需额外对结果进行反转操作。
  • 层序遍历的 BFS 实现
    • 利用队列实现按层处理,每一层结束后通过 leftToRight 切换方向,确保按照锯齿形顺序遍历。

算法复杂度分析:

  1. 时间复杂度

    • 每个节点被访问一次,且每次访问操作的插入复杂度为 (O(1)) 或 (O(1))(在 LinkedList 的头部或尾部操作)。
    • 总时间复杂度为 (O(N)),其中 (N) 是二叉树的节点数。
  2. 空间复杂度

    • 主要由队列的存储和结果列表 result 决定。
    • 在最坏情况下(例如完全二叉树的最后一层),队列可能需要存储 (O(N)) 个节点。
    • 空间复杂度为 (O(N))。

示例运行过程(输入示例中的树):

输入树结构:

    3
   / \
  9  20
     /  \
    15   7
第1层:
  • queue 初始包含根节点 [3]
  • leftToRight = true,从左到右读取当前层:
    • 输出 [3]
  • 下一层加入节点 [9, 20]
  • 切换方向:leftToRight = false
第2层:
  • queue 包含 [9, 20]
  • leftToRight = false,从右到左读取当前层:
    • 输出 [20, 9]
  • 下一层加入节点 [15, 7]
  • 切换方向:leftToRight = true
第3层:
  • queue 包含 [15, 7]
  • leftToRight = true,从左到右读取当前层:
    • 输出 [15, 7]

最终结果为 [[3], [20, 9], [15, 7]]


如果有其他问题或需要进一步优化解释,请随时告诉我!

java 实现

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root == null) return result;

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean lefttoright = true;
        while(!queue.isEmpty()) {
            int levelsize = queue.size();
            // level 用于存放每层的遍历结果
            LinkedList<Integer> level = new LinkedList<>();
            for(int i = 0; i < levelsize; i++) {
                TreeNode node = queue.poll();
                if(lefttoright) {
                    level.add(node.val);
                } else {
                    level.addFirst(node.val);
                }
                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
            lefttoright = !lefttoright;
            result.add(level);
        }
        return result;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++哈希表(原理、实现、开放寻址法)适合新手

c系列哈希的原理及实现&#xff08;上&#xff09; 文章目录 c系列哈希的原理及实现&#xff08;上&#xff09;前言一、哈希的概念二、哈希冲突三、哈希冲突解决3.1、开放寻址法3.2、删除操作3.3、负载因子四、代码实现 总结 前言 红黑树平衡树和哈希有不同的用途。 红黑树、…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型&#xff0c;表示为二阶微分方程组。本文以一个二杆系统为例&#xff0c;介绍如何用MATLAB符号工具得到微分方程表达式&#xff0c;只需要…

MongoDB集群分片安装部署手册

文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装&#xff08;三台均需要操作&#xff09;2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …

java 调用 k8s crd 生成 crd model

k8s官方提供了自动生成Java模型代码的工具&#xff0c;使用指南&#xff1a; https://github.com/kubernetes-client/java提供有两种方法&#xff1a; github action远程生成本地docker镜像生成 本地docker镜像生成很简单&#xff0c;跟着官方指南下载镜像执行命令即可&…

36 基于单片机的电磁炉系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20温度传感器检测温度&#xff0c;通过八位数码管显示&#xff0c; 如果温度超过阈值&#xff0c;则蜂鸣器报警&#xff0c;红灯亮起&#xff1b;若不超过阈值&…

IoTDB 常见问题 QA 第一期

开始&#xff01;关于 IoTDB 的 Q&A 我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;WAL 堆积导致写入失败 问题及现象 集群报错&#xff1a; The write is rejec…

buildroot 制作Linux嵌入式文件系统,并添加telnet 以及ssh

在开始配置前&#xff0c;我们需要了解SSH和Telnet的基本概念。SSH&#xff08;Secure Shell&#xff09;为加密的网络协议&#xff0c;用于在不安全的网络中执行命令并管理网络服务。相对于SSH&#xff0c;Telnet是一个老旧且非加密的协议&#xff0c;用于进行远程登录 sshd 服…

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…

【赵渝强老师】PostgreSQL中的模式

在PostgreSQL中&#xff0c;所有的数据库对象都是属于模式中的对象。这里的数据库对象包括&#xff1a;表、索引、视图、存储过程、触发器等等。所有数据库对象都有各自的对象标识符oid&#xff08;object identifiers&#xff09;,它是一个无符号的四字节整数&#xff0c;相关…

【分页查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Android 图形系统之四:Choreographer

Choreographer 是 Android 系统中负责帧同步的核心组件&#xff0c;它协调输入事件、动画和绘制任务&#xff0c;以确保界面以固定频率&#xff08;通常是每 16ms&#xff0c;一帧&#xff09;流畅渲染。通过管理 VSYNC 信号和调度任务&#xff0c;Choreographer 是实现流畅 UI…

计算机毕业设计Python异常流量检测 流量分类 流量分析 网络流量分析与可视化系统 网络安全 信息安全 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

关于扩散方程的解

1-D 扩散方程的形式 Cauchy齐次方程 这个解无积分无级数&#xff0c;很简单的形式 美其名曰&#xff1a;基本解。 把基本解和初值做卷积&#xff0c;就得到cauchy方程的解。

零基础学安全--Burp Suite(4)proxy模块以及漏洞测试理论

目录 学习连接 一些思路 proxy模块 所在位置 功能简介 使用例子 抓包有一个很重要的点&#xff0c;就是我们可以看到一些在浏览器中看不到的传参点&#xff0c;传参点越多就意味着攻击面越广 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可…

python打包深度学习虚拟环境

今天师兄让我把环境打包发给他&#xff0c;我才知道可以直接打包深度学习虚拟环境&#xff0c;这样另一个人就不用辛辛苦苦的去装环境了&#xff0c;我们都知道有些论文他需要的环境很难装上。比如装Apex&#xff0c;装 DCN&#xff0c;mmcv-full 我现在把3090机子上的ppft虚拟…

M4V 视频是一种什么格式?如何把 M4V 转为 MP4 格式?

M4V 是一种视频文件格式&#xff0c;主要由苹果公司用于其产品和服务中&#xff0c;如 iTunes Store 上的电影和电视节目。这种格式可以包含受版权保护的内容&#xff0c;并且通常与苹果的 DRM&#xff08;数字版权管理&#xff09;技术结合使用&#xff0c;以限制内容的复制和…

【C++】从零到一掌握红黑树:数据结构中的平衡之道

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言1 红黑树的概念**红黑树的五大性质** 2 红黑树的实现2.1 红黑树的结构…

webpack(react)基本构建

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的主要功能是将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;视为模块&#xff0c;并将它们打包成一个或多个输出文件&#xff0c;以便…

C++STL(四)-->vector 的模拟实现

1.vector的各函数接口&#xff1a; namespace cl {//模拟实现vectortemplate<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//默认成员函数vector(); //构造函数vector(size_t n, cons…

机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述 任务&#xff1a;根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来 数据源&#xff1a;csv文件&#xff08;train.csv&#xff09; 目标变量&#xff1a;Survived&#xff08;0-1变量&#xff09; 数据集预览&#xff1a; 1、英文描述&#xff1a; 2、…