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

二叉树的锯齿形层次遍历

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

例如:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]
复制代码
/**
 * 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>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if( root == null ) return res;
        Deque<TreeNode> tree = new LinkedList<>();
        tree.add( root );
        TreeNode end = root;
        Boolean flag = true;
        List<Integer> list = new ArrayList<>();
        while( !tree.isEmpty() ){
          TreeNode cur = flag ?  tree.pollFirst() : tree.pollLast();
          list.add( cur.val );
          if( flag ){
              if( cur.left != null ){
                 tree.offerLast( cur.left );
              }
              if( cur.right != null ){
                  tree.offerLast( cur.right );
              }
          
          }else{
              if( cur.right != null ){
                  tree.offerFirst( cur.right );
              }
              if( cur.left != null ){
                 tree.offerFirst( cur.left );
              } 
          }  
          if( cur == end ){
              res.add( list );
              list = new ArrayList<>();
              end = flag ? tree.peekFirst() : tree.peekLast();
              flag = !flag;
          }  
        }
        return  res;
    }
}
复制代码

解题思路: 使用双向链表保存下一层的值 , 用end指向当前层遍历的最后一个结点,如果当前层的遍历顺序是从左到右 , 则每次弹出的都是链表的第一个元素 , 然后再把左右结点压入链表的尾部,先压左再压右;如果当前层的遍历顺序是从右到左,则每次弹出的都是最后一个结点 , 然后把右左压入到头部,先压右再压左。

转载于:https://juejin.im/post/5c905caef265da60cf50e833

相关文章:

  • LINUX下禁止root用户远程登录
  • 项目中常用的19条MySQL优化
  • linux系统优化
  • Java版人脸识别SDK 虹软arcface (demo)
  • 一张图告诉你,只会jQuery还不够!
  • Istio 1.1 版本发布,性能和可用性提升
  • 桥牌笔记:Skill Level 4 D8
  • datax同步MySQL数据到mongodb
  • zephir的安装
  • jav核心(十四):集合类型操作:Collection、List、Set;Map集合;Iterator迭代器
  • 赋值,copy和deepcopy
  • 洛谷 4382 [八省联考2018]劈配——二分图匹配
  • ubuntu18.04系统下用devstack安装openstack(最新版)
  • Solr笔记二之Solr与Tomcat整合
  • 代码块
  • Google 是如何开发 Web 框架的
  • .pyc 想到的一些问题
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • bootstrap创建登录注册页面
  • Bytom交易说明(账户管理模式)
  • css系列之关于字体的事
  • Date型的使用
  • ES10 特性的完整指南
  • Flannel解读
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaScript 基本功--面试宝典
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 搞机器学习要哪些技能
  • 简单易用的leetcode开发测试工具(npm)
  • 坑!为什么View.startAnimation不起作用?
  • 你不可错过的前端面试题(一)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 问题之ssh中Host key verification failed的解决
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用Canvas画一棵二叉树
  • 怎样选择前端框架
  • 中文输入法与React文本输入框的问题与解决方案
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 选择阿里云数据库HBase版十大理由
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • "无招胜有招"nbsp;史上最全的互…
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #FPGA(基础知识)
  • $.each()与$(selector).each()
  • (003)SlickEdit Unity的补全
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费分享)基于springboot,vue疗养中心管理系统
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net refrector