T32-1

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {/*思想:利用层次遍历思想,只不过注意这里返回的是一个数组,所以可以先借助一个list,先把元素存到Listz中然后再根据list的size去新建一个len=size的数组,再返回*/public int[] levelOrder(TreeNode root) {if(root==null) return new int[0];  List<Integer> list = new ArrayList<>();LinkedList<TreeNode> queue = new LinkedList<>();//层次遍历queue.add(root);while(!queue.isEmpty()){TreeNode temp = queue.remove();list.add(temp.val);if(temp.left!=null){queue.add(temp.left);}if(temp.right!=null){queue.add(temp.right);}}//数组转化int idx = 0;int[] res= new int[list.size()];for(int i=0;i<list.size();i++){res[idx++] = list.get(i);}return res;}
}

T32-2
思想:32-1的一种变形,也就是相当于逐层打印,还是利用层次遍历,不过要区别不同层,注意一点如何更新rear指针(指向每层的最后一个结点)

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root==null) return res;LinkedList<TreeNode> queue = new LinkedList<>();List<Integer> layer = new ArrayList<>();//rear用于指向每层的最后一个阶段TreeNode rear = null;//层次遍历 queue.add(root);rear = root;while(!queue.isEmpty()){TreeNode temp = queue.remove();layer.add(temp.val);//先将非空左右孩子入队,便于更新rearif(temp.left!=null){queue.add(temp.left);}if(temp.right!=null){queue.add(temp.right);}//表明temp是本层最后一个结点if(temp.equals(rear)){res.add(layer);layer = new ArrayList<>();//更新rear指针,令其指向下一层的最后一个结点也就是此时queue中的最后一个入队结点//这里注意要加一个队列是否为空的判断,为空时表示没有下一层了,也就不用更新rear了,当队列不为空时才去更新rearif(!queue.isEmpty()){rear = queue.getLast();}}}return res;}
}

T32-3 之字型打印二叉树
思想:题目意思是先按从左到右的顺序打印每一层的元素再按从右到左的顺序打印下一层元素依次类推,交替打印
其实也就是让我们分奇偶层打印,还是可以按照从左往右的顺序进行层次遍历,然后只不过在往res添加本层元素列表layer时要依旧层数是奇数层还是偶数层:
当是偶数层时就直接添加layer即可
当是奇数层时要添加layer的逆序,因为layer中是按从左往右打印本层元素的


class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root==null) return res;LinkedList<TreeNode> queue = new LinkedList<>();List<Integer> layer = new ArrayList<>();//rear用于指向每层的最后一个阶段TreeNode rear = null;//层次遍历 queue.add(root);rear = root;int layerCounts = 0;//表示层数while(!queue.isEmpty()){TreeNode temp = queue.remove();layer.add(temp.val);//按从左到右的顺序打印本层元素(顺序打印下一层元素)if(temp.left!=null){queue.add(temp.left);}if(temp.right!=null){queue.add(temp.right);}//表明temp是本层最后一个结点if(temp.equals(rear)){//判断本层的层数是奇数还是偶数以此决定打印顺序  if(layerCounts%2!=0){Collections.reverse(layer);}res.add(layer);//层数+1layerCounts++;  layer = new ArrayList<>();if(!queue.isEmpty()){rear = queue.getLast();} }}return res;
}}

T32-3改进型:
思想:上面那个做法还需要额外的逆序操作,此时可以借助LinkedList实现双端队列来避免进行额外的逆序操作

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root==null) return res;LinkedList<TreeNode> queue = new LinkedList<>();//注意这里用LinkedList也就是双端队列来存每层元素LinkedList<Integer> layer = new LinkedList<>();//rear用于指向每层的最后一个阶段TreeNode rear = null;//表示层数int layerCounts = 0;//层次遍历 queue.add(root);rear = root;while(!queue.isEmpty()){TreeNode temp = queue.remove();//根据层数的奇偶来确定本层元素的打印顺序不是遍历顺序,遍历顺序均是按从左往右!!!   if(layerCounts%2==0){layer.addLast(temp.val);}else{layer.addFirst(temp.val);}if(temp.left!=null) queue.add(temp.left);if(temp.right!=null) queue.add(temp.right);//temp为本层的最后一个结点if(temp.equals(rear)){res.add(layer);  //层数自增1   layerCounts++;layer = new LinkedList<>();//更新rear指针if(!queue.isEmpty()){rear = queue.getLast();}} }return res;}
}

剑指offer T32及其变种从上到下打印二叉树(之字型打印)相关推荐

  1. 剑指offer面试题[23]-从上往下打印二叉树(按层序打印)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. /* struct TreeNode {int val;struct TreeNode *left;struct TreeNode * ...

  2. 剑指offer(21)从上往下打印二叉树

    public class Solution {public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {//创建俩个数列 ...

  3. 剑指offer刷题记录(上)

    记录刷题过程,方便自己后期回顾 题目来自<剑指offer>,在牛客上OC,思路大多来自剑指offer,偶尔来自自己的碎碎念,代码自己瞎写的,如果有更优的方法请告诉我,谢谢大佬们 语言:py ...

  4. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 8 二叉树中序遍历的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注 ...

  5. 【剑指offer-Java版】23从上往下打印二叉树

    从上往下打印二叉树:如果把这个书看做是一个特殊的图,那么该打印过程就类似于一个广度优先遍历 public class _Q23 {public <T> void PrintTreeFrom ...

  6. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...

  7. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  8. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer

    题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...

  9. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  10. 挑战一天(12h)刷完《剑指offer》67题

    提前说明,挑战的人不是我. 大家周末好,我是爱上 B 站的小吴,最近一段时间我在网站 AlgoMooc 录制剑指 Offer 的视频,同时上传了一部分到 B 站,基于推荐算法,B 站疯狂的给我推送如何 ...

最新文章

  1. win10 编译姿态估计AlphaPose
  2. linux看门狗树莓派,给树莓派安装看门狗
  3. 【面向对象】类的特殊成员方法
  4. python实战-pdf文件转txt
  5. 转 c#读写xml文件
  6. JBoss 4.2.x Spring 3 JPA Hibernate教程
  7. php语言注册信息表,php语言表的空结果
  8. POI实现大数据EXCLE导入导出,解决内存溢出问题
  9. 找出数组的最大公约数
  10. 创建hadoop 归档文件
  11. 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
  12. python教程ppt第五章_Python 3基础教程 第5章面向对象编程.ppt
  13. 期刊论文分析的技巧与程序
  14. excel函数提取计算机登录名,excel常用函数怎么提取姓氏?excel常用函数提取姓氏的方法...
  15. 微信小程序漂亮按钮(中间矩形两端半圆形)
  16. OA、CRM、ERP、BPM系统
  17. 计算机打印机副机无法打印,打印机共享无法打印怎么办,教您解决电脑打印机共享无法打印...
  18. ajax传递多参数类型,Ajax传递不同类型的参数
  19. 怎么恢复电脑删除的文件,误删除数据恢复
  20. 电脑无法识别扫码枪怎么办?看4点解决方法就知道

热门文章

  1. css轻松写出梦幻西游动画效果
  2. 双摄像头做slsm_刚刚考完!真实双机位复试经验帮你避雷!
  3. addClass(““).delay().removeClass(““);没有效果的解决方式
  4. cocos creator3.x 触控方向键实现
  5. 奇点云数据中台技术汇(三)| DataSimba系列之计算引擎篇
  6. 什麼是雲端服務?阿正老師教你免費玩Amazon EC2雲端主機!(上篇)
  7. 移动端html5广告的优势,移动端H5广告的互动类型探析
  8. html 在线测试 鱼缸,新做的草缸教程,看1遍你也会做,鱼缸造景其实很简单
  9. “我去图书馆”公众号代码抢座的实现
  10. 怎么样通过API函数获取tooltip的内容(请高手帮忙)