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

二叉树的之字形遍历 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,15,7,#,#}, 该二叉树之字形层序遍历的结果是 3 20 9 15 7 输入格式 一行字符串,只包含大写字母和#。 此处采用完全二叉树的顺序存储结构。 输出格式 若干行,之字形输出树的结点,每一行输出树的一层。 输入样例 ABC###D## 输出样例 A C B D 基本思路: 1、通过观察题意,我们可以发现,这个题目构造二叉树的时候可以通过完全二叉树的顺序存储结构进 阅读详情

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

该二叉树之字形层序遍历的结果是

[

[1],

[3,2],

[4,5]

]

2023-08-30更新,更加简洁的解法:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这题要求的是先从左边,下一层从右边,在下一次从左边……左右交替的。我们可以使用一个变量leftToRight,如果是true就表示从左边开始打印,否则就从右边开始打印,代码:

    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null)
            return res;
        //创建队列,保存节点
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);//先把节点加入到队列中
        boolean leftToRight = true;//第一步先从左边开始打印
        while (!queue.isEmpty()) {
            //记录每层节点的值
            List<Integer> level = new ArrayList<>();
            //统计这一层有多少个节点
            int count = queue.size();
            //遍历这一层的所有节点,把他们全部从队列中移出来,顺便
            //把他们的值加入到集合level中,接着再把他们的子节点(如果有)
            //加入到队列中
            for (int i = 0; i < count; i++) {
                //poll移除队列头部元素(队列在头部移除,尾部添加)
                TreeNode node = queue.poll();
                //判断是从左往右打印还是从右往左打印。
                if (leftToRight) {
                    //如果从左边打印,直接把访问的节点值加入到列表level的末尾即可
                    level.add(node.val);
                } else {
                    //如果是从右边开始打印,每次要把访问的节点值
                    //加入到列表的最前面
                    level.add(0, node.val);
                }
                //左右子节点如果不为空会被加入到队列中
                if (node.left != null)
                    queue.add(node.left);
                if (node.right != null)
                    queue.add(node.right);
            }
            //把这一层的节点值加入到集合res中
            res.add(level);
            //改变下次访问的方向
            leftToRight = !leftToRight;
        }
        return res;
    }

思路:

我们可以利用两个栈遍历这棵二叉树,第一个栈s1从根节点开始记录第一层,然后依次遍历两个栈,遍历第一个栈时遇到的子节点依次加入第二个栈s2中,即是第二层

//遍历奇数层
while(!s1.empty()){ 
    TreeNode* node = s1.top();
    //记录奇数层
    temp.push_back(node->val); 
    //奇数层的子节点加入偶数层
    if(node->left)  
        s2.push(node->left);
    if(node->right) 
        s2.push(node->right);
    s1.pop();
}
而遍历第二个栈s2的时候因为是先进后出,因此就是逆序的,再将第二个栈s2的子节点依次加入第一个栈s1中:

while(!s2.empty()){ 
    reeNode* node = s2.top();
    //记录偶数层
    temp.push_back(node->val);  
    //偶数层的子节点加入奇数层
    if(node->right)  
        s1.push(node->right);
    if(node->left) 
        s1.push(node->left);
    s2.pop();
}

具体做法:

  • step 1:首先判断二叉树是否为空,空树没有打印结果。
  • step 2:建立两个辅助栈,每次依次访问第一个栈s1与第二个栈s2,根节点先进入s1.
  • step 3:依据依次访问的次序,s1必定记录的是奇数层,访问节点后,将它的子节点(如果有)依据先左后右的顺序加入s2,这样s2在访问的时候根据栈的先进后出原理就是右节点先访问,正好是偶数层需要的从右到左访问次序。偶数层则正好相反,要将子节点(如果有)依据先右后左的顺序加入s1,这样在s1访问的时候根据栈的先进后出原理就是左节点先访问,正好是奇数层需要的从左到右访问次序。
  • step 4:每次访问完一层,即一个栈为空,则将一维数组加入二维数组中,并清空以便下一层用来记录。

图示:

 代码如下:

public ArrayList<ArrayList<Integer>> Print(TreeNode root) {
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    if(root == null)
        return res;

    Stack<TreeNode> s1 = new Stack<>();
    Stack<TreeNode> s2 = new Stack<>();
    s1.push(root);
    while(!s1.isEmpty() || !s2.isEmpty()){
        if(!s1.isEmpty()){
            ArrayList<Integer> list = new ArrayList<>();
            while(!s1.isEmpty()){
                TreeNode cur = s1.pop();
                list.add(cur.val);
                if(cur.left != null)
                    s2.push(cur.left);
                if(cur.right != null)
                    s2.push(cur.right);
            }
            res.add(list);
        }
        if(!s2.isEmpty()){
            ArrayList<Integer> list = new ArrayList<>();
            while(!s2.isEmpty()){
                TreeNode cur = s2.pop();
                list.add(cur.val);
                if(cur.right != null)
                    s1.push(cur.right);
                if(cur.left != null)
                    s1.push(cur.left);               
            }
            res.add(list);
        }
    }
    return res;
}

使用双向队列:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            LinkedList<Integer> list = new LinkedList<>();
            int size = q.size();
            for(int i = 0; i < size;i++){
                TreeNode cur = q.poll();
                if(res.size() %2 == 0){
                    list.addLast(cur.val);//每次插入到最后一个
                }
                else{
                    list.addFirst(cur.val);//每次插入到第一个
                }
                if(cur.left != null){
                    q.offer(cur.left);
                }
                if(cur.right != null){
                    q.offer(cur.right);
                }
            }
            res.add(list);
        }
        return res;

    }
}

二叉树的之字形层次遍历 1、两个栈实现二叉树的层次遍历 阅读详情

相关推荐

golang常见算法之二叉树

二叉树是一种常见的数据结构,在计算机科学中被广泛使用。本文将介绍二叉树的概念、实现方法和应用场景,以及在Golang中如何实现二叉树。

SMILY12138的博客 403

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

描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{1,2,3,#,#,4,5} 该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ] 示例1 输入: {1,2,3,#,#,4,5} 复制返回值: [[1],[3,2],[4,5]] import java.util.*; /* public class TreeNode { int val = 0; Tr

搓搓那年时光静好 467

freertos移植心得

1.freertos移植msp430 今天终于移植成功了freertos。现在写下这篇博文来整理这一路移植过程中遇到的问题和心得。 由于使用的是IAR FOR MSP430的IDE,博文只讨论在IAR下的移植。本文针对的是官方支持的平台架构下的移植,不使用官方提供的demo,得到的是一个纯洁版的系统。 1.下载源代码 在freertos的官网下载一份最新的源代码点击打开链接。 2.选择平

一条狗的博客 4172

LeetCode高频题:二叉树的锯齿形(Z字形,之字形)层序遍历

1)普通的bfs二叉树层序遍历,非常简单,字节将队列不断从左往右加就行了 2)本题就是从1)改变来的,bfs队列控制,奇数层的时候,让加入队列的顺序从右往左,偶数层的时候,加入队列从左往右 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。.........

weixin_46838716的博客 1274

电力电子新手必看:COT控制模式的工作原理与典型应用场景解析

本文深入解析了COT控制模式的工作原理及其在电力电子领域的典型应用。COT控制(恒定导通时间控制)通过固定导通时间机制,解决了传统滞环控制的问题,特别适用于需要快速瞬态响应和高效率的应用场景,如CPU/GPU供电和便携设备电源管理。文章详细介绍了COT控制的核心流程、技术特点及设计实践中的关键考量,帮助电力电子新手快速掌握这一技术。

weixin_30745553的博客 520

高效敏感词检测API平台对比与选型指南

本文为开发者提供了高效敏感词检测API平台的选型指南。文章对比了专业API平台、头部云厂商、新兴AI服务商及开源方案,从检测能力、集成易用性、成本、稳定性及扩展性五大维度进行分析,并给出实战选型建议,帮助团队根据业务场景快速选择最合适的敏感词检测服务。

weixin_29325955的博客 341

Leetcode刷题(第103题)——二叉树的锯齿形层次遍历

一、题目 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 二、示例 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]] 输入:root = [1] 输出:[[1]] 输入:root = [] 输出:[] 三、思路 本题在层序遍历的基础上,新增了锯齿形,也就是按照z自行进行遍历。所以我们只需要记录层数的下标即可,在每一次层数为奇数时,则从右向左遍

weixin_47450807的博客 253

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 645

Z字形遍历二叉树

常见的二叉树遍历,有层次遍历、前序遍历、中序遍历、后序遍历。其中层次遍历中最常见的是正序层次遍历,但也会出现Z字形遍历的情况:如果从左向右输出第n行,则下一行从右向左输出。正序层次遍历是利用队列的先到先得性质,很明显Z字形遍历要用到栈得性质来实现。我们在输出时,可以借助行的奇、偶性,实现代码如下: void print(Tree *root) { if (root == NULL) ...

MSFollower的博客 2646

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1245

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 202

【算法】JZ77 按之字形顺序打印二叉树

题目链接 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 题解 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: ve

Bitdancing的专栏 464

Ubuntu声卡检测与故障排查:从基础命令到驱动修复

本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。

g2h3i4j5的博客 228

二叉树之字形层次遍历

题目:给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,15,7,#,#},使用之字遍历的结果为[[3],[20][9],[15][7]] 算法思想:为每一行建立newLIst与newLine,和行标识符flag(flag=0:倒着输入某一行,flag=1:正着输入) 根据flag将结点的值以数组的形式存入到newLine之中,之后在添加到大数组result中 将此行结点的左右孩子添加到newlist之中,为遍历下一行

qq_43774324的博客 484

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1682

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 方法一: 用两个stack,,如果当前打印的节点为奇数行,则先存左子节点,再存右子节点,如果当前打印的节点为偶数行,则先存右子节点,再存左子节点。 方法二: 存储的时候一直从左向右存储,打印的时候根据不同的层依次打印 这里用方法二 # -*- ...

weixin_44088837的博客 254

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

“按照之字形顺序打印二叉树”

描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0≤n≤15000≤n≤1500,树上每个节点的val满足∣val∣<=100∣val∣<=100 要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n) 例如: 给定的二叉树是{1,2,3,#,#,4,5} 该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ] 示例1 输入:{1,2,3,#,#,4,5} 返回值:[..

yizhizainulii的博客 600

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

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

之字形顺序打印二叉树是一种层序遍历的变种,它要求我们在遍历每层节点时,按指定的方向打印。这种问题不仅考察我们对二叉树遍历的掌握,还需要我们灵活运用数据结构来管理遍历的顺序。通过上述代码,我们可以高效地实现这一功能,并在复杂的树结构中应用。😁热门专栏推荐想学习vue的可以看看这个java基础合集数据库合集redis合集nginx合集linux合集手写机制微服务组件spring_尘觉springMVCmybits🤔欢迎大家加入我的社区尘觉社区。

业精于勤,荒于嬉 1601

二叉树的之字形层序遍历

二叉树的之字形层序遍历 1、参考资料 https://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559 2、题目要求 题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如:给定的二叉树是 {3,9,20,#,#,15,7} 该二叉树之字形层序遍历的结果是 [ [3], [20,9], [15,7] ] 示例 输入 {1,#,2} 输出 [[1],[2]] 3、代码思路

Oneby的博客 3294

可视化图解算法23:二叉树的层序遍历

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。

weixin_42117918的博客 1105

常考数据结构与算法:二叉树的之字形层序遍历

题目描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树之字形层序遍历的结果是 [ [3], [20,9], [15,7] ] 示例1 输入 {1,#,2} 返回值 [[1],[2]] 二叉树遍历,脑海中立刻想到的就是深度优先遍历和广度优先遍历,这两种方式相信大家都驾轻就熟了,就不再过多累赘。 import java.util.ArrayLis...

m0_37564426的博客 523

(二叉树z字形层次遍历)LeetCode#103. Binary Tree Zigzag Level Order Traversal

按照z字形层次遍历二叉树

小仙女的博客 5101

Scau 18959 二叉树的之字形遍历 C/C++(简单、直接、易懂)

18959 二叉树的之字形遍历 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description 题目来源:字节跳动测试题 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{3,9,20,15,7,#,#}, 该二叉树之字形层序遍历的结果是 3 20 9 15 7 输入格式 一行字符串,只包含大写字母和#。 此处采用完全二叉树的顺序存储结构。 输出格

m0_52463794的博客 959

Golang二叉树

代码实现 package zgo_algorithm import ( "fmt" "sync" ) // 二叉树 type TreeNode struct { Data interface{} // 节点用来存放数据 Left *TreeNode // 左子树 Right *TreeNode // 右字树 } // 先序遍历:先访问根节点,再访问左子树,最后访问右子树。 func PreOrder(tree *TreeNode) { if tree == nil { ret

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 479
上一篇: Leetcode102. 二叉树的层序遍历
下一篇: Leetcode144 二叉树的前序遍历
魑魅魍魉114
博客等级 码龄10年 165粉丝 240原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值