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

剑指offer---3、按之字形顺序打印二叉树

剑指offer---3、按之字形顺序打印二叉树

一、总结

一句话总结:

|||-begin

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

|||-end

可以先快速把所有题目过一遍,先主干,后枝叶
考点就是树的层次遍历

 

1、如何解决效率低的问题(将每层的数据存进ArrayList中,偶数层时进行reverse操作,在海量数据时,这样效率太低了)?

思路:利用Java中的LinkedList的底层实现是双向链表的特点。
可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历

 

 

 

二、内容在总结中

1、相关知识

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

 

2、代码

/**
 * 大家的实现很多都是将每层的数据存进ArrayList中,偶数层时进行reverse操作,
 * 在海量数据时,这样效率太低了。
 *
 * 下面的实现:不必将每层的数据存进ArrayList中,偶数层时进行reverse操作,直接按打印顺序存入
 * 思路:利用Java中的LinkedList的底层实现是双向链表的特点。
 *     1)可用做队列,实现树的层次遍历
 *     2)可双向遍历,奇数层时从前向后遍历,偶数层时从后向前遍历
 */
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
    if (pRoot == null) {
        return ret;
    }
    ArrayList<Integer> list = new ArrayList<>();
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.addLast(null);//层分隔符
    queue.addLast(pRoot);
    boolean leftToRight = true;
     
    while (queue.size() != 1) {
        TreeNode node = queue.removeFirst();
        if (node == null) {//到达层分隔符
            Iterator<TreeNode> iter = null;
            if (leftToRight) {
                iter = queue.iterator();//从前往后遍历
            } else {
                iter = queue.descendingIterator();//从后往前遍历
            }
            leftToRight = !leftToRight;
            while (iter.hasNext()) {
                TreeNode temp = (TreeNode)iter.next();
                list.add(temp.val);
            }
            ret.add(new ArrayList<Integer>(list));
            list.clear();
            queue.addLast(null);//添加层分隔符
            continue;//一定要continue
        }
        if (node.left != null) {
            queue.addLast(node.left);
        }
        if (node.right != null) {
            queue.addLast(node.right);
        }
    }
     
    return ret;
}

 

 

 

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/11029373.html

相关文章:

  • 艾森尼克:提供高品质大通量RO膜,树立滤芯行业新标杆!
  • 《JAVA——帮你解决高并发秒杀》
  • MyBatis源码分析-MyBatis初始化流程
  • 左神算法进阶班1_4Manacher算法
  • centos下安装mysql5.7
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  • PHP删除MySQL数据库下的所有数据表
  • 记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新
  • 数组相关排序
  • 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  • Java基础学习总结(23)——GUI编程
  • JDBC 通过PreparedStatement 对数据库进行增删改查
  • JPA常用注解
  • php的插入排序,通过双层for循环
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • node-glob通配符
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php面试题 汇集2
  • python3 使用 asyncio 代替线程
  • Redux系列x:源码分析
  • Twitter赢在开放,三年创造奇迹
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue实战(四)登录/注册页的实现
  • 复习Javascript专题(四):js中的深浅拷贝
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 提醒我喝水chrome插件开发指南
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端高清、多屏适配方案
  • ​虚拟化系列介绍(十)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (10)ATF MMU转换表
  • (Python第六天)文件处理
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Micro Framework初体验(二)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET框架
  • .NET是什么
  • .NET微信公众号开发-2.0创建自定义菜单
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [20171101]rman to destination.txt
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Android] 修改设备访问权限
  • [bug总结]: Feign调用GET请求找不到请求体实体类