AcWing 45. 之字形打印二叉树(双栈法+reverse方法)

【LeetCode】之字形顺序打印二叉树(层序遍历 / 双端队列 / 双栈),清晰推演过程 一、题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [20,9], [15,7] ] 二、思路分析 这个题目考察的是二叉树的层序遍历的问题。比起普通的层序遍历,它增加了新的要求:按照之子形的顺序来打印。下面我们分别介绍三 阅读详情

1.双栈法

根据经验,我们可以发现这道题需要对层次遍历的模板进行一定的改动。如果我们将根节点所在层定义为第0层,可以发现凡是偶数层都是从左往右打印,而奇数层却恰好相反。考虑到下一层与上一层节点的关系以及他们的相反输出次序,可以试着引入栈来进行反向输出的操作。那么问题来了,要怎么去设计对栈的控制呢?

这里的方案是引入两个栈,一个负责偶数层节点,记作stack0,另一个负责奇数层的,记作stack1。偶数层节点出栈前将其孩子压入stack1,次序是先左后右。奇数层节点出栈前将其孩子压入stack0,次序是先右后左。当当前负责出栈的栈为空时说明当前层已经完全遍历,需要换行。此时只要换做另一个栈来重复以上操作即可。

我们以样例中的二叉树为例。首先,8压入了stack0,出栈前将12,2压入了stack1,8出栈后stack0变空,切换到stack1进行操作;stack1中2先出栈,出站前将4,6压入stack0,然后12出栈,stack1变空,切换到stack0进行操作;stack0再将6,4出栈。程序结束。

具体代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;
        stack<TreeNode *> stack[2];
        int state = 0; //state为0表示从左往右打印,为1则从右往左打印
        stack[state].push(root);
        vector<int> temp;
        while(!stack[state].empty()){
            TreeNode *p = stack[state].top();
            stack[state].pop();
            temp.push_back(p -> val);
            if(!state){ //偶数层节点的孩子入栈次序为先左后右
                if(p -> left) stack[(state + 1) % 2].push(p -> left);
                if(p -> right) stack[(state + 1) % 2].push(p -> right);
            }
            else{ //奇数层的孩子入栈次序为先右后左
                if(p -> right) stack[(state + 1) % 2].push(p -> right);
                if(p -> left) stack[(state + 1) % 2].push(p -> left);
            }
            if(stack[state].empty()){ //当前栈为空说明需要换行
                ans.push_back(temp);
                temp.clear();
                state = (state + 1) % 2; //改变当前层的奇偶性状态
            }
        }
        return ans;
    }
};

2.reverse方法

这种方法实际上是对双栈法的简化。这里不再需要设置两个栈,只是在当前层遍历完毕后判断层数的奇偶性。如果是奇数层则用reverse()反转向量并保存,否则不需反转直接保存即可。

关于层数判断的方法,这里采用的是标记法(请参考我的另一篇博文)。

具体代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;
        queue<TreeNode *> q;
        q.push(root);
        q.push(NULL);
        int state = 0; //state为0表示从左往右打印,为1则从右往左打印
        vector<int> temp;
        while(!q.empty()){
            TreeNode *p = q.front();
            q.pop();
            if(p){
                temp.push_back(p -> val);
                if(p -> left) q.push(p -> left);
                if(p -> right) q.push(p -> right);
            }
            else{ //节点为空说明需要换行
                if(state) reverse(temp.begin(), temp.end()); //根据层数奇偶性判断是否要反转
                ans.push_back(temp);
                state = (state + 1) % 2; //改变当前层的奇偶性状态
                temp.clear();
                if(!q.empty()) q.push(NULL);
            }
        }
        return ans;
    }
};

 

滑模控制理论(SMC)概述 滑模控制理论(SMC)概述一、背景二、数学理论三、高维拓展四、分析 一、背景 滑模控制理论(Sliding Mode Control, SMC)是一种建立在现代控制理论基础上的控制理论,主要数学核心为李雅普诺夫函数。 滑模控制的核心思想是建立一个滑模面,将被控系统拉取到滑模面上来,使系统沿着滑模面运动。滑模控制的一个优势是无视外部扰动和不确定参数,采用一种比较“暴力”的方式达到控制的目的。 其思想和反步法有些类似,但数学实现起来更加方便而不抽象。相比反步法,滑模控制没有复杂的数学计算,也不会出现“微分爆炸” 阅读详情

相关推荐

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

107二叉树的层次遍历 II(队列+reverse)

1、题目描述 给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 2、示例 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其自底向上的层次遍历为: [[15,7], [9,20], [3] ] 3、题解 基本思想:队列,...

Revendell的博客 226

SPH vs Lagrange网格混合建模实战:用LS-DYNA模拟弹丸穿孔效应

本文深入探讨了在LS-DYNA中运用SPH与Lagrange网格混合建模技术,高效模拟超高速碰撞下弹丸穿孔效应的实战方法。通过分析模型分区策略、耦合界面处理及关键参数设置,解决了传统方法在模拟大变形、材料断裂时的网格畸变或计算成本高昂问题,为相关工程仿真提供了兼顾精度与效率的解决方案。

weixin_29211309的博客 109

按之字形顺序打印二叉树(两个栈的问题)

解题思路: 思路1.大家的实现很多都是将每层的数据存进ArrayList中,偶数层时进行reverse操作,在海量数据时,这样效率太低了。 思路2.按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数层,则先保存右子结点再保存左子结点到第二个栈里。 具体说: 设两个栈,s1...

Gunther的博客 254

基于STM32、HAL库的BMP585 气压传感器 驱动程序设计

define BMP585_I2C_ADDR_PRIMARY 0x76 << 1 /* 0x76地址左移一位 */#define BMP585_I2C_ADDR_SECONDARY 0x77 << 1 /* 0x77地址左移一位 *//* I2C句柄 *//* I2C地址 *//* 设置新的温度过采样率 *//* 设置新的滤波器系数 *//* 芯片ID *//* 清除温度过采样位 *//* 转换为hPa *//* 设置新的压力过采样率 *//* 设置新的电源模式 *//* 清除压力过采样位 */

corlin6688的博客 459

【AI Agent系列】【阿里AgentScope框架】0. 快速上手:AgentScope框架简介与你的第一个AgentScope程序

这是我们学习的第四款智能体框架了。前面我们学习了 AutoGPT、MetaGPT、LangGraph 等智能体应用开发框架,各有优缺点。今天我们开始学习AgentScope这一款多智能体开发框架。卷起来吧,多看看,多用用,没坏处。

同学小张的博客 5425

之字形打印二叉树(双栈法)——剑指Offer

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 题目分析 主要是利用两个栈,一个栈存储从左到右的结点,打印出来是从右到左;另一个栈存储从右到左的结点,打印出来是从左到右。 详情请看注释。 代码 C++代码如下: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre

weixin_38933749的博客 233

【DEIM创新改进】全网首发、独家特征融合创新改进篇 | CVPR2025 | 引入RLAB残差线性注意力特征融合块,有效融合并强调多尺度特征,有效减少信息丢失,助力DEIM目标检测有效涨点

本文提出了一种改进DEIM网络模型的新方法RLAB(残差线性注意力特征融合模块),用于医学图像生物标志物分割。RLAB模块通过多尺度残差精炼和注意力机制,有效整合编码器跳跃连接与解码器特征图,提升特征对齐和关键区域关注能力。实验表明,该方法在MoNuSeg、DSB等四个医学图像数据集上显著优于现有方法,最高提升4.03%的绝对性能。文章详细介绍了RLAB的网络结构、核心代码实现方式,并提供了将模块集成到DEIM模型的具体步骤。

Ai缝合怪、助力小伙伴高效发论文 349

剑指offer刷题:之字形打印二叉树

之字形打印二叉树,例子如下所示: 采用两个栈来实现之字形打印,两个栈分别存储奇数和偶数行二叉树的节点 /* * 1 * / \ * 2 3 * / \ / * 4 5 6 * */ #include <iostream> #include <vector> #...

weixin_42274486的博客 216

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4917

按之字形打印二叉树的节点【两个栈实现】

按之字形打印二叉树的节点【两个栈实现】

江说江湖专栏:欠世界一个伟大的产品! 902

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1020

按之字形打印二叉树(思路与实现)

题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:奇数行从左到右打印,偶数行从右到左打印。那么使用两个栈,一个栈存奇数行(先保存右子树再保存左子树),一个栈存偶数行(先保存左子树再保存右子树)。仔细分析下:第一行是奇数行,只有一个入奇数栈。然后出栈。出站的同时用偶数栈将该结点的左子树保存,再...

疯狂的1024 2724

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

翻转二叉树(LeetCode 226)

二叉树翻转是一道经典的面试编程题,经常出现在各大公司的招聘笔试面试环节。这里还有个趣事,Homebrew的作者Max Howell某天去 Google 面试,面试官出了一道翻转二叉树的题目,然而 Max Howell 没答上来,结果被拒。面试官的评语是:“我们 90% 的工程师使用您编写的软件,但是您却无法在面试时在白板上写出翻转二叉树这道题,所以滚蛋吧”。可见,在求职面试过程中,即使你是一位优秀的程序员,如果答不上算法题,那么在算法方面的能力将被面试官认为是不及格的,甚至无法被聘用。

Doublelv 的博客专栏。 3221

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

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

AcWing 34. 链表中环的入口结点(快慢指针赛跑+地址映射)

1.快慢指针赛跑 这是一个做起来很巧妙的算法,而且这个方法既不会改变原链表的结构,又不会需要额外的空间。 具体的操作是:从头结点开始,令快指针每次移动两个单位,慢指针每次移动一个单位。如果链表有环则两个指针必定会在环上的某一个位置相遇。此时令快指针重回起点,然后让两个指针同时每次移动一个单位,当两个指针再次相遇时(必定会相遇),相遇的结点恰好就是环的入口结点。 证明如下: 假设链表...

Zee_Chao的博客 1493

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

AcWing解题目录(C++)

# 试题名称 思想方法 难度 试题来源 1 A+B 简单 AcWing 2 01背包问题 简单 3 完全背包问题 简单 4 多重背包问题I 简单 5 多重背包问题II 中等 6 多重背包问题...

Zee_Chao的博客 900

AcWing 21. 斐波那契数列(迭代算法(或DP算法))

斐波那契数列的求法有很多种,这里只列举一种最简单的方法。我们先假设斐波那契数列是如下排列的: 下标 0 1 2 3 4 5 …… 数据 0 1 1 2 3 5 …… 我们先设置两个变量f和g,并分别初始化为0和1以代表第0号元素和第1号元素。然后我们可以很容易地发现,只要不断重复进行如下操作 f ...

Zee_Chao的博客 864

AcWing 1.A+B

具体代码如下: #include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a+b; return 0; }

Zee_Chao的博客 650

AcWing 23. 矩阵中的路径(DFS)

这是一道比较经典的深度优先搜索问题。首先,记录下每个字符串的起点位置。然后从每个位置开始进行深度优先搜索。 具体代码如下: class Solution { public: int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; bool dfs(vector<vector<char>...

Zee_Chao的博客 551

AcWing 51. 数字排列(DFS(有重复排列+无重复排列))

OJ上这道题的描述并不清晰。实际上,它的要求是输出所有“不重复的排列方式”。 1.next_permutation()(无重复排列) 要解决数组无重复排列的问题,那么这个方法是再合适不过的了。在使用这个函数前注意要引入<algorithm>头文件并且为了保证可以枚举所有情况要实现对数组进行“由小到大”的排序。 具体代码如下: class Solution { public...

Zee_Chao的博客 515

AcWing 14. 不修改数组找出重复的数字(分治法)

如果不将思考题考虑在内的话,那么AcWing 13.找出数组中重复的数字中的方法1的代码是可以完全移植过来的。这里不再赘述。不过,由于这道题的样例里面不存在含有超出范围的数据以及全部数据均出现一次的情况,因此代码还可以进一步简化。 简化后的具体代码如下: class Solution { public: int duplicateInArray(vector<int>...

Zee_Chao的博客 494

AcWing 13.找出数组中重复的数字(循环交换)

1.方法1 简单来说就是开辟一个空间为n的向量用来做数字出现次数的统计。由于题目只要求返回任意一个重复的数字,因此只需遍历统计向量找到首个记录出现次数大于1的数字即可。 具体代码如下: class Solution { public: int duplicateInArray(vector<int>& nums) { int n = nums...

Zee_Chao的博客 490

AcWing 15. 二维数组中的查找(非递归算法和递归算法)

1.非递归算法 观察此二维数组(以下称为“矩阵”),可以发现该矩阵的副对角线上的每一个元素均满足一个规律,那就是其左侧在同一行的元素均比其小,下侧在同一列的元素均比其大。于是,从副对角线入手进行查找就可以通过一次比较操作排除一整行和一整列的元素。从而大幅缩短时间开销。具体操作就是,当前位置元素如果等于目标元素则直接返回true,小于目标元素则将遍历指针下移一个单位,大于目标元素则将遍历指针左...

Zee_Chao的博客 467

AcWing 49. 二叉搜索树与双向链表(前驱后继+中序遍历)

1.利用前驱后继 对于一个二叉树,可以将其分为左子树、根节点和右子树三部分。根据题目要求可知将BST化为一个排好序的双向链表实际上就是将其中序遍历序列对应的各个节点连接起来。同时还可以知道若根的左右子树非空,则根节点在链表中的前驱结点一定在其左子树中,后继结点一定在其右子树中。那么可以先找到并标记根节点的前驱和后继,然后连接。同时递归执行这一过程便能达到要求。 具体代码如下: /** ...

Zee_Chao的博客 420

AcWing 27. 数值的整数次方

1.方法1 根据题意只需要按常规的循环处理就行了。 具体代码如下: class Solution { public: double Power(double base, int exponent) { int n = abs(exponent); //取绝对值可以简化代码,等输出时再判断是否取倒数返回 double ans = 1.; ...

Zee_Chao的博客 416
上一篇: AcWing 44. 分行从上往下打印二叉树(计数法+标记法)
下一篇: AcWing 46. 二叉搜索树的后序遍历序列
Zee_Chao
博客等级 码龄11年 168粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值