当前位置: 首页 > news >正文

剑指offer-59、按之字形顺序打印⼆叉树

实现⼀个函数按照之字形打印⼆叉树,即第⼀⾏按照从左到右的顺序打印,第⼆层按照从右⾄左的顺序打印,第三⾏按照从左到右的顺序打印,其他⾏以此类推。

示例1
输⼊:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]

思路及解答

双向链表(推荐)

  1. 借助双向链表,初始化⼀个添加⽅向 boolean 值,先将根节点添加进去:
  2. 获取 list ⾥⾯剩下的元素的个数,挨个取出就是⼀层,取出的时候,如果 reverse 为 true ,则往链表的第 0 个索引位置添加,否则直接在后⾯添加,然后判断每⼀个取出来的节点的左右节点是不是为空,不为空则加⼊链表。
  3. 每⼀层处理完之后,将 list 加⼊结果集中,然后翻转 reverse 的值,继续判断 list 是不是为空,执⾏第⼆步循环。

java

public class Solution { public ArrayList < ArrayList < Integer >> Print(TreeNode pRoot) { LinkedList < TreeNode > nodes = new LinkedList < > (); ArrayList < ArrayList < Integer >> results = new ArrayList(); boolean reverse = true; if (pRoot != null) { nodes.add(pRoot); while (!nodes.isEmpty()) { ArrayList < Integer > integers = new ArrayList(); int size = nodes.size(); for (int i = 0; i < size; i++) { TreeNode node = nodes.poll(); if (reverse) { integers.add(node.val); } else { integers.add(0, node.val); } if (node.left != null) { nodes.offer(node.left); } if (node.right != null) { nodes.offer(node.right); } } if (integers.size() != 0) { results.add(integers); } reverse = !reverse; } } return results; } }
  • 空间复杂度由于借助了额外的 list ,为 O(n)
  • 时间复杂度,由于每个节点进⼊队列⼜出来,为 O(2n) ,也是 O(n) 。

队列 + 方向反转

这是最直接的方法。我们进行标准的层序遍历,但用一个标志位记录当前层是奇数层还是偶数层。对于偶数层,我们在将该层的节点值列表加入最终结果前,先进行反转

java

import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (pRoot == null) return result; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(pRoot); boolean leftToRight = true; // 方向标志,true表示从左到右 while (!queue.isEmpty()) { int levelSize = queue.size(); // 当前层的节点数 ArrayList<Integer> levelList = new ArrayList<>(); // 遍历当前层的所有节点 for (int i = 0; i < levelSize; i++) { TreeNode node = queue.poll(); levelList.add(node.val); // 将节点值加入当前层列表 // 将下一层的节点按标准顺序(先左后右)加入队列 if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } // 如果是偶数层(从第0层开始算则为奇数索引),反转当前层列表 if (!leftToRight) { Collections.reverse(levelList); } result.add(levelList); leftToRight = !leftToRight; // 切换方向 } return result; } }
  • 时间复杂度:O(n)。每个节点被访问一次,对于偶数层,Collections.reverse的时间复杂度为 O(当前层节点数),所有层的节点数相加为 n,因此总时间复杂度为 O(n)。
  • 空间复杂度:O(n)。队列和结果列表所需空间与节点数 n 成线性关系。

双栈交替

利用栈后进先出(LIFO)的特性来自然地实现顺序的反转。我们使用两个栈,一个用于处理当前层,另一个用于存储下一层的节点

java

import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (pRoot == null) return result; Stack<TreeNode> stack1 = new Stack<>(); // 处理奇数层(从左到右) Stack<TreeNode> stack2 = new Stack<>(); // 处理偶数层(从右到左) stack1.push(pRoot); // 当两个栈都为空时,遍历结束 while (!stack1.isEmpty() || !stack2.isEmpty()) { ArrayList<Integer> levelList = new ArrayList<>(); if (!stack1.isEmpty()) { // 处理stack1(奇数层),其子节点将以“从右到左”的顺序压入stack2 while (!stack1.isEmpty()) { TreeNode node = stack1.pop(); levelList.add(node.val); // 关键:先左子节点后右子节点入栈,出栈顺序则为先右后左 if (node.left != null) stack2.push(node.left); if (node.right != null) stack2.push(node.right); } } else { // 处理stack2(偶数层),其子节点将以“从左到右”的顺序压入stack1 while (!stack2.isEmpty()) { TreeNode node = stack2.pop(); levelList.add(node.val); // 关键:先右子节点后左子节点入栈,出栈顺序则为先左后右 if (node.right != null) stack1.push(node.right); if (node.left != null) stack1.push(node.left); } } result.add(levelList); } return result; }
http://www.cnnetsun.cn/news/1610691.html

相关文章:

  • 免费视频硬字幕提取终极指南:VSE如何让87种语言字幕一键生成SRT文件
  • Java边缘运行时安全加固实战(CVE-2023-25194等11个高危漏洞闭环方案)
  • 太空计划|agent|mojo
  • 万象视界灵坛入门必看:CLIP-ViT-L/14与OpenCLIP、Salesforce BLIP对比选型
  • 告别官方文档!用IntelliJ IDEA 2023.3 + Flutter 3.19 搭建环境,我踩过的坑你别再踩了
  • OneMore插件:3大核心功能让OneNote效率提升300%
  • 终极指南:如何用Nucleus Co-Op在一台电脑上实现本地多人分屏游戏
  • RexUniNLU开源大模型部署教程:ModelScope集成+Jupyter快速调用
  • 用STM32F103C8T6和DS18B20复刻电赛经典:红外光通信装置从原理到调试全记录
  • 伪代码示例:阳极多孔介质参数设置
  • OpenCV+Python纹理分割避坑指南:暗斑检测的形态学参数调优技巧
  • 告别肝游烦恼:FGA智能工具如何让F/GO玩家效率提升300%
  • 突破多人游戏同步难题:UnityLockstep框架深度解析
  • 零基础玩转eNSP:手把手教你用AR路由器搭建DHCP服务器(含PC连通性测试)
  • Java中使用四叶天动态代理IP构建代理池——HttpClient与Jsoup爬虫实战
  • 3D点云分割实战:如何用稀疏卷积SparseConvNet提升模型效率(附Facebook开源库指南)
  • 智能升级:利用快马AI模型为你的电子书网站添加摘要生成与推荐
  • 开源标注工具格式处理指南:解决80%标注格式难题的3大核心方案
  • 在AutoDL上搞定nuScenes数据集:从解压到mmdetection3d初始化,附赠避坑指南
  • 抖音视频批量下载终极指南:3分钟快速搭建个人视频资源库
  • 达梦数据库安装后必做的5项配置优化(Windows环境)
  • 基于广电五舟ARM服务器与IPMI管理口,一站式部署Proxmox VE及国产操作系统的实践指南
  • JavaScript 开发 - Object 的 hasOwn 方法
  • 新手也能懂:DCDC芯片外围那个神秘的‘自举电容’,到底怎么选才不会翻车?
  • 为什么自动驾驶地铁离不开形式化方法?从法国B方法到上海15号线的实战解析
  • Session服务器配置指南与使用经验
  • 跨平台开源工具WorkshopDL:游戏玩家的资源获取终极解决方案
  • 户外探险必备!IP6163芯片如何用200W柔性太阳能板给无人机持续供电(附电路设计图)
  • MAI-UI-8B应用初体验:用智能体自动操作手机APP的奇妙之旅
  • 阿里云百炼Coding Plan 的GLM-5等模型是全参数满血版的吗?显示售罄怎么回事?