热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一刷327剑指Offer32III.从上到下打印二叉树III(m)

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照

题目:
请实现一个函数按照之字形顺序打印二叉树,
即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,
其他行以此类推。
--------------------------
示例:
给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7
返回其层次遍历结果:
[[3],[20,9],[15,7]
]
提示:
节点总数 <&#61; 1000
----------------

在这里插入图片描述

思考&#xff1a;层序遍历 &#43; 双端队列&#xff08;Java 中将链表 LinkedList 作为双端队列使用。&#xff09;
利用双端队列的两端皆可添加元素的特性&#xff0c;设打印列表&#xff08;双端队列&#xff09; tmp &#xff0c;并规定&#xff1a;
奇数层 则添加至 tmp 尾部 &#xff0c;
偶数层 则添加至 tmp 头部 。
------------------
算法流程&#xff1a;
1、特例处理&#xff1a; 当树的根节点为空&#xff0c;则直接返回空列表 [] &#xff1b;
2、初始化&#xff1a; 打印结果空列表 res &#xff0c;包含根节点的双端队列 deque &#xff1b;
3、BFS 循环&#xff1a; 当 deque 为空时跳出&#xff1b;1、新建列表 tmp &#xff0c;用于临时存储当前层打印结果&#xff1b;2、当前层打印循环&#xff1a; 循环次数为当前层节点数&#xff08;即 deque 长度&#xff09;&#xff1b;1、出队&#xff1a; 队首元素出队&#xff0c;记为 node&#xff1b;2、打印&#xff1a; 若为奇数层&#xff0c;将 node.val 添加至 tmp 尾部&#xff1b;否则&#xff0c;添加至 tmp 头部&#xff1b;3、添加子节点&#xff1a; 若 node 的左&#xff08;右&#xff09;子节点不为空&#xff0c;则加入 deque &#xff1b;3、将当前层结果 tmp 转化为 list 并添加入 res &#xff1b;
4、返回值&#xff1a; 返回打印结果列表 res 即可&#xff1b;
----------------
复杂度分析&#xff1a;
时间复杂度 O(N)&#xff1a; N 为二叉树的节点数量&#xff0c;即 BFS 需循环 N 次&#xff0c;占用 O(N)&#xff1b;双端队列的队首和队尾的添加和删除操作的时间复杂度均为 O(1)
空间复杂度 O(N)&#xff1a; 最差情况下&#xff0c;即当树为满二叉树时&#xff0c;最多有 N/2 个树节点 同时 在 deque 中&#xff0c;使用 O(N)大小的额外空间。
------------------
Java 中将链表 LinkedList 作为双端队列使用。
------------------
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val &#61; x; }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue &#61; new LinkedList<>();//定义双端队列List<List<Integer>> res &#61; new ArrayList<>();//定义结果集&#xff1a; 动态数组if (root &#61;&#61; null) return res;//特判queue.add(root);//双端队列初始化while (!queue.isEmpty()) {//循环结束条件LinkedList<Integer> temp &#61; new LinkedList<>();for (int i &#61; queue.size(); i > 0; i--) {TreeNode node &#61; queue.poll();if (res.size() % 2 &#61;&#61; 0) {temp.addLast(node.val);//偶数层-> 队列头部 temp}else temp.addFirst(node.val);//奇数层-> 队列尾部 tempif (node.left !&#61; null) queue.add(node.left);if (node.right !&#61; null) queue.add(node.right);}res.add(temp);}return res;}
}

LC


推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
author-avatar
mobiledu2502874643
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有