【面试经典 150 | 二叉树层序遍历】二叉树的锯齿形层序遍历

news2025/1/13 10:22:24

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:层序遍历+双端队列
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【二叉树】【层序遍历】【双端队列】


题目来源

103. 二叉树的锯齿形层序遍历


解题思路

方法一:层序遍历+双端队列

思路

本题不同于其他进行层序遍历二叉树的题目,我们还要将每一层的节点值存储下来,并且相邻层的节点值存储顺序不同。比如这一层的节点值是从左到右存储,那么下一层的节点值是从右往左存储。

为此,我们可以使用一个数组按从左往右顺序存储,如果需要从右往左存储,则逆序即可。

我们再想一想,从左往右存储节点值实际上就是在数组后增加值,从右往左存储节点就是在数组前增加节点值,这就是双端队列的 push_backpush_front 啊。于是我们可以使用双端队列来存储不同顺序的节点值。

注意,我们还需要维护一个 bool 变量 isOrderLeft 用来表示当前是按照从左往右还是从右往左的顺序存储节点值。我们初始化 isOrderLeft = true 表示双端队列的 push_back 操作,即从左往右存储。如果 isOrderLeft = false,则表示双端队列的 push_front 操作,即从右往左存储。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
	vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
		vector<vector<int>> ans;
		if (root == NULL)
			return ans;

		queue<TreeNode*> q;
		q.push(root);
		bool isOrderLeft = true;
		while (!q.empty()) {
			deque<int> leaves;
			int size = q.size();
			for (int i = 0; i < size; ++i) {
				TreeNode *curr = q.front(); q.pop();
				if (isOrderLeft)
					leaves.push_back(curr->val);
				else
					leaves.push_front(curr->val);

				if (curr->left)
					q.push(curr->left);
				if (curr->right)
					q.push(curr->right);
			}
			ans.emplace_back(vector<int>(leaves.begin(), leaves.end()));
			isOrderLeft = !isOrderLeft;
		}
		return ans;
	}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为二叉树中的节点数,每个节点会仅会被遍历一次。

空间复杂度: O ( n ) O(n) O(n),我们需要维护存储节点的队列和存储节点值的双端队列。


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

决策树原理及应用

目录 一、决策树概述 1.1决策树的组成 1.2构建决策树 1.3决策树的剪枝 1.4决策树的优点和缺点 二、决策树在计算机视觉中的应用 三、基于决策树的图像分类实例 一、决策树概述 决策树是一种非常流行的机器学习算法&#xff0c;它用树状图的形式来表示决策过程。决策树可…

HarmonyOS开发实例:【分布式邮件】

概述 基于TS扩展的声明式开发范式编程语言编写的一个分布式邮件系统&#xff0c;可以由一台设备拉起另一台设备&#xff0c;每次改动邮件内容&#xff0c;都会同步更新两台设备的信息。效果图如下&#xff1a; 搭建OpenHarmony开发环境 完成本篇Codelab我们首先要完成开发环境…

NLP自然语言处理_序章

开一个新篇章&#xff0c;立一个flag&#xff0c;用一段时间来学习一下NLP&#xff0c;涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门&#xff0c;此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理&#xff1f; NLP…

【ARFoundation自学01】搭建AR框架+检测平面+点击克隆立方体到地面=自信入门!

介绍 AR 的功能其实是个大手机系统厂商和眼镜设备厂商开发的功能&#xff0c;并不是Unity的功能&#xff0c;毕竟Unity没有自己的手机设备&#xff01;比如谷歌公司的安卓开发了ARcore&#xff0c;让所有安卓8.0版本以上的用户能够在手机上体验AR功能&#xff01;苹果推出了AR…

局域网无法连接怎么办?

局域网连接是我们日常生活和工作中常用的方式之一&#xff0c;但有时我们可能会遇到局域网无法连接的问题。这给我们的工作和生活带来了很大的困扰。本文将介绍局域网无法连接的常见原因&#xff0c;并推荐一款名为【天联】的组网产品&#xff0c;它能够解决不同地区间的局域网…

Meta Llama 3 简介

文章目录 要点我们对 Llama 3 的目标最先进的性能模型架构训练数据扩大预训练规模指令微调与 Llama 3 一起建造系统级责任方法大规模部署 Llama 3Llama 3 的下一步是什么&#xff1f;立即尝试 Meta Llama 3 本文翻译自&#xff1a;https://ai.meta.com/blog/meta-llama-3/ 要点…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

jeecgflow之camunda工作流-并行网关

引言 书接上回&#xff0c;继续三国流程系列教程。 本文主要讲解并行网关。 并行网关允许流程中的多个任务同时执行&#xff0c;从而提高流程的执行效率。 并行网关会忽视序列流上的条件设置。 并行网关分为两部分。 Fork: 用于任务开始 Join:用于任务结束 体验文章demo演示站…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库&#xff08;SDK&#xff09;二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库&#xff08;SDK&#xff09; 在Harmon…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面&#xff1a;面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象&#xff1f; 面向对象 是具有对象概念的编程范式&#xff0c;面向对象将程序实现分为了一个个独立的对象&…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

Hadoop的安装及配置

8.下面我们开始安装配置Hadoop 1&#xff09;首先下载hadoop-2.7.2的jar包 并添加到我们的jtxy1的/root/目录下 2&#xff09;yum install在线安装软件 yum install net-tools //支持ifconfig yum install vim //支持vim yum install glibc.i686 --java命令不好使 3&am…

人工智能论文GPT-3(2):2020.5 Language Models are Few-Shot Learners;微调;少样本Few-Shot (FS)

2 方法Approach 我们的基本预训练方法&#xff0c;包括模型、数据和训练&#xff0c;与GPT-2中描述的过程相似&#xff0c;只是模型规模、数据集规模和多样性&#xff0c;以及训练时长有所扩大&#xff0c;相对简单直接。 我们使用的上下文学习也与GPT-2相似&#xff0c;但在…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序&#xff0c;下方应用程序输出界面显示乱码. 但正常运行无乱码&#xff1a; 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名&#xff0c;有点类似数据库的视图&#xff0c;别名一般都会和一些过滤条件相结合&#xff0c;可以做到即使是同一个索引上&#xff0c;让不同人看到不同的数据。 别名的作用 在开发中&#xff0c;一般随着业务需求的迭代&#xff0c;较老的业务逻辑就要面临更新…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

JVM 讲解 (主要类加载其以及流程和机制(双亲委派))

JVM有什么用&#xff1f; 说白了&#xff0c;就是我们编写 Java 代码&#xff0c;编译 Java 代码&#xff0c;目的不是让它在 Linux、Windows 或者 MacOS 上跑&#xff0c;而是在 JVM 上跑。&#xff08;保证只要有JVM这个东西&#xff0c;就可以跨平台使用Java) 可以把JVM想象…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种&#xff0c;REQUIRED 支持当前事务&#xff0c;如果不存在&#xff0c;就新建一个&#xff0c;EQUIRES_NEW 如果有事务存在&#xff0c;挂起当前事务&#xff0c;创建一个新的事务 同一个service中必须用代理对象调用&#xff0c;否则失效