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

二叉树的锯齿形层序遍历

在这里插入图片描述

代码逻辑

这道题如果用队列(Queue)来做层序遍历,然后每层根据奇偶性决定是正序还是反序。

这样操作会遇到一些麻烦,比如用双端队列(Deque),需要频繁在两端操作;如果用普通队列,收集结果时需要反转列表。

今天分享一种解法:

用一个静态数组模拟队列,通过索引控制实现锯齿形遍历。

1. 用数组模拟队列
public static TreeNode[] queue = new TreeNode[MAXN];
public static int l, r;  // l是队头,r是队尾
2. 双循环结构

第一个循环:收集当前层的节点值

for (int i = reverse ? r - 1 : l, j = reverse ? -1 : 1, k = 0; k < size; i += j, k++) {TreeNode cur = queue[i];list.add(cur.val);
}

如果 reverse == false(从左到右):il 开始,每次 +1

如果 reverse == true(从右到左):ir-1 开始,每次 -1

第二个循环:扩展下一层节点

for (int i = 0; i < size; i++) {TreeNode cur = queue[l++];  // 从队头取出if (cur.left != null) {queue[r++] = cur.left;   // 放入队尾}if (cur.right != null) {queue[r++] = cur.right;}
}

按照左到右的顺序处理节点,把下一层的节点依次加入队列。

完整代码

public static int MAXN = 2001;public static TreeNode[] queue = new TreeNode[MAXN];public static int l, r;  // l是队头,r是队尾public static List<List<Integer>> zigzagLevelOrder(TreeNode root){List<List<Integer>> ans = new ArrayList<>();if(root!=null){l=r=0;queue[r++]=root;boolean reverse = false;while(l<r){int size = r-l;ArrayList<Integer> list = new ArrayList<>();for(int i=reverse?r-1:l,j=reverse?-1:1,k=0;k<size;i+=j,k++){TreeNode cur = queue[i];list.add(cur.val);}for (int i = 0; i < size; i++) {TreeNode cur = queue[l++];  // 从队头取出if (cur.left != null) {queue[r++] = cur.left;   // 放入队尾}if (cur.right != null) {queue[r++] = cur.right;}}ans.add(list);reverse = !reverse;}}return ans;}
http://www.dtcms.com/a/541807.html

相关文章:

  • Java8:新日期时间
  • Java_String对象特性
  • 网站做app的软件有哪些360安全浏览器
  • 网站建设 互成网络amp 网站开发
  • 网站app免费生成软件下载免费 片
  • USB基础知识--Endpoint与pipe
  • SpringBoot拦截器实战与原理剖析
  • 把握智能语音风口:云蝠智能【声・纪元】VoiceAgent 实时语音智能论坛邀您同行
  • 一文吃透二叉树、完全平衡树、红黑树原理及C语言实现
  • 做网站用别人的图片沈阳设计公司排名
  • 浙江自己如何做网站wordpress 做后台
  • 网站 模板下载陕西富通建设有限公司网站
  • 淄博高效网站建设免费网站建站模板
  • Bootstrap4 Jumbotron详解与使用指南
  • IoT技术在产线实践中的应用
  • 合格VR大空间企业:核心要素有哪些?
  • 06.OpenStack网络管理
  • C++学习记录(23)智能指针
  • 网站内容策划方案wordpress底部版权信息修改
  • python 在class中几种函数的定义和用法
  • 电商数据中台基石:通过 API 构建淘宝商品实时数据源
  • 川崎机器人焊接电源气体省气
  • 理想汽车基于 Hologres + Flink 构建万亿级车联网信号实时分析平台
  • php教育视频网站开发如何做古诗词网站
  • 自发购卡网站在吗做手机建立网站软件
  • Git Tag 理解和使用
  • 如何写一个WebRTC ACE音频应用处理模块
  • 当机器拥有感觉:从电子皮肤到视频神经系统的具身智能革命
  • 快速搭建网站服务器网站推广策划方案
  • 【Linux基础知识系列:第一百六十三篇】创建虚拟网络:Linux网络桥接