leetcode刷题(剑指offer) 103.二叉树的锯齿形层序遍历

news/2025/3/15 6:40:00/

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

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000]
  • -100 <= Node.val <= 100

解题思路与二叉树的层序遍历类似,我则是在遍历的基础上加了方向的标志位,依靠判断方向的标志位,对数组进行翻转。

代码如下:

public List<List<Integer>> zigzagLevelOrder(TreeNode root) {if (null == root) {return new ArrayList<>();}Queue<TreeNode> queue = new ArrayDeque<>();TreeNode lastNode = root;TreeNode nextLastNode = null;// 0 表示从左往右, 1表示从右往左int direction = 0;List<List<Integer>> res = new ArrayList<>();List<Integer> list = new ArrayList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();list.add(node.val);if (node.left != null) {queue.add(node.left);nextLastNode = node.left;}if (node.right != null) {queue.add(node.right);nextLastNode = node.right;}if (node == lastNode) {lastNode = nextLastNode;if (direction == 1) {Collections.reverse(list);}res.add(list);list = new ArrayList<>();direction = 1 - direction;}}return res;}

但是这种方法是不是太笨了呢,明明可以直接存好,还特意进行了依次翻转逻辑,所以参考了大佬的代码。

直接遍历每一层的节点,然后根据当前是层级的奇偶,来对数组进行前向添加数据和后向添加数据,代码如下:

public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();List<List<Integer>> res = new ArrayList<>();if (root != null) {queue.add(root);}while (!queue.isEmpty()) {LinkedList<Integer> list = new LinkedList<>();// queue里面是一层所有的节点for (int i = queue.size(); i > 0; i--) {TreeNode node = queue.poll();if (res.size() % 2 == 0) {list.addLast(node.val);} else {list.addFirst(node.val);}if (node.left != null) {queue.add(node.left);}if (node.right != null) {queue.add(node.right);}}res.add(list);}return res;}

http://www.ppmy.cn/news/1340755.html

相关文章

【JavaEE进阶】 图书管理系统开发日记——叁

&#x1f334;前言 在前面我们实现了用户登录的接口。现在我们来实现图书列表展示页面。 &#x1f38b;数据准备 创建图书表&#xff0c;并初始化数据 -- 图书表 DROP TABLE IF EXISTS book_info; CREATE TABLE book_info (id INT ( 11 ) NOT NULL AUTO_INCREMENT,book_nam…

【Maven】 总是困扰我的一些问题

问题 不知道很多小伙伴是不是总觉得 Maven 一次性配置好之后就再也没动过&#xff0c;然后突然之间需要换版本之后&#xff0c;各种报错。IDEA都在和你作对。 总结一些小技巧 作为笔记 1、Maven 下载地址 Maven – 下载 Apache Maven 2、Maven 版本 和 IDEA 版本对应问题…

Java学习day26:和线程相关的Object类的方法、等待线程和唤醒线程(知识点详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day25&#xff1a;守护线…

美国的服务器平台盘点 (服务器美国节点哪家好)

一般来说&#xff0c;企业所选服务器的不同是根据业务种类的不同而促成的。对于业务范围主要在国内活动的站长来说&#xff0c;国内服务器足矣;但对于外贸行业来说&#xff0c;想把海外业务扩展起来的话&#xff0c;更适用于使用国外服务器。当前&#xff0c;国外服务器中&…

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config&#xff0c;每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题&#xff0c;那就是当服务节点数量非常庞大的时候&#xff0c;我们不可能一台一台服务器挨个去手工触…

python算法与数据结构---滑动窗口双指针

学习目标 了解滑动窗口的基本原理&#xff1b;学会用使用python语言解答滑动窗口经典题目&#xff1b;了解双指针的基本原理&#xff1b;学会使用python语言解答双指针经典题目&#xff1b; 滑动窗口 209. 长度最小的子数组 https://leetcode.cn/problems/minimum-size-sub…

MySQL语句 |条件语句 IFNULL 和 COALESCE 的区别

在MySQL中&#xff0c;IFNULL和COALESCE都是用来处理NULL值的函数&#xff0c;但它们之间存在一些重要的差异。 函数定义 IFNULL(expr1, expr2): 如果expr1为NULL&#xff0c;则返回expr2&#xff0c;否则返回expr1。COALESCE(value1, value2, ..., valueN): 返回参数列表中的…

博云科技与中科可控全面合作,探索前沿金融科技新机遇

2024年1月26日&#xff0c;博云科技与中科可控在昆山高新区成功举办合作签约仪式。昆山市委常委、昆山高新区党工委书记孙道寻、中科可控董事长聂华、博云科技董事长花磊等领导出席了本次签约仪式。 中科可控将利用其在先进计算和智造领域的优势&#xff0c;为博云科技提供有关…