立志用最少的代码做最高效的表达


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

例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]

提示:
节点总数 <= 1000


解法:双端队列或两个栈

双端队列解法:若奇数层,从队列头取元素,并且从左至右,将两个子节点从队尾入队;若偶数层,从队列尾取元素,并且从右至左,将两个子节点从队头入队

栈解法同理


/*** 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>> levelOrder(TreeNode root) {boolean isLeft = true;List<List<Integer>>list = new ArrayList<>();if(root == null) return list;           // 节点为空的情况ArrayDeque<TreeNode> q = new ArrayDeque<>();         // 队列q.add(root);                    // 先加入头结点while(!q.isEmpty()) {           // 当队列非空时一直运行int nowLevelNums = q.size();    // 记录当前节点数,若节点数减为0,则代表该层结束List<Integer>tmpList = new ArrayList<>();       // 存储每一层的节点的值while(nowLevelNums-- != 0) {if(isLeft) {// 从头结点开始,把新节点添加到尾部TreeNode tmp = q.removeFirst();tmpList.add(tmp.val);// 先左后右if(tmp.left != null) q.addLast(tmp.left);if(tmp.right != null) q.addLast(tmp.right);} else {TreeNode tmp = q.removeLast();tmpList.add(tmp.val);// 先右后左if(tmp.right != null) q.addFirst(tmp.right);if(tmp.left != null) q.addFirst(tmp.left);}}list.add(tmpList);isLeft = !isLeft;}return list;}
}

完整可运行代码

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;public class 剑指Offer32_III_从上到下打印二叉树III {static class TreeNode{int val;TreeNode left, right;TreeNode(int v) { val = v; }}// 最初的思路,交换左右子节点的入队顺序,提交后错误,static class Solution1{public List<List<Integer>> levelOrder(TreeNode root) {boolean flag = true;List<List<Integer>>list = new ArrayList<>();if(root == null) return list;           // 节点为空的情况Queue<TreeNode> q = new ArrayDeque<>();         // 队列q.add(root);                    // 先加入头结点while(!q.isEmpty()) {           // 当队列非空时一直运行int nowLevelNums = q.size();    // 记录当前节点数,若节点数减为0,则代表该层结束List<Integer>tmpList = new ArrayList<>();       // 存储每一层的节点的值while(nowLevelNums-- != 0) {TreeNode tmp = q.remove();              // 将队列中的每个节点都出队,逐一判断tmpList.add(tmp.val);if(flag) {if(tmp.right != null) q.add(tmp.right);if(tmp.left != null) q.add(tmp.left);} else {if(tmp.left != null) q.add(tmp.left);if(tmp.right != null) q.add(tmp.right);}}flag = !flag;list.add(tmpList);}return list;}}// 于是改为双端队列static class Solution2{public List<List<Integer>> levelOrder(TreeNode root) {boolean isLeft = true;List<List<Integer>>list = new ArrayList<>();if(root == null) return list;           // 节点为空的情况ArrayDeque<TreeNode> q = new ArrayDeque<>();         // 队列q.add(root);                    // 先加入头结点while(!q.isEmpty()) {           // 当队列非空时一直运行int nowLevelNums = q.size();    // 记录当前节点数,若节点数减为0,则代表该层结束List<Integer>tmpList = new ArrayList<>();       // 存储每一层的节点的值while(nowLevelNums-- != 0) {if(isLeft) {// 从头结点开始,把新节点添加到尾部TreeNode tmp = q.removeFirst();tmpList.add(tmp.val);// 先左后右if(tmp.left != null) q.addLast(tmp.left);if(tmp.right != null) q.addLast(tmp.right);} else {TreeNode tmp = q.removeLast();tmpList.add(tmp.val);// 先右后左if(tmp.right != null) q.addFirst(tmp.right);if(tmp.left != null) q.addFirst(tmp.left);}}list.add(tmpList);isLeft = !isLeft;}return list;}}public static void main(String[] args) {}
}

【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III相关推荐

  1. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

  2. 【简洁+注释】剑指 Offer 32 - II. 从上到下打印二叉树 II

    立志用最少的代码做最高效的表达 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回其层次遍历结果 ...

  3. 【简洁写法】剑指 Offer 32 - I. 从上到下打印二叉树

    立志用最少的代码做最高效的表达 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回: [3,9,20,1 ...

  4. 剑指 Offer 32 - I. 从上到下打印二叉树

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 返回: [3,9,20,1 ...

  5. 剑指 Offer 32 - II. 从上到下打印二叉树 II

    2020-06-22 1.题目描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 2.题解 广度优先搜索,即层次遍历即可 3.代码 /*** Definition fo ...

  6. JZ32变形~剑指 Offer 32 - II. 从上到下打印二叉树 II

    放假不学习/上班,学习不放假.放假当然是不能学习或工作啦

  7. 剑指 Offer 32 - I. 从上到下打印二叉树(Java迭代法实现)

    给定二叉树: [3,9,20,null,null,15,7] 找下规律, 发现队列可以实现层次遍历, 比如根节点3先入队,再将队列的第一个节点出队,并将出队的左右子节点(不为空)入队,直到队列为空. ...

  8. LeetCode-剑指 Offer 32 - I. 从上到下打印二叉树

    剑指 Offer 32 - I. 从上到下打印二叉树 思路一:BFS广度优先遍历 1: 定义一个res返回值 2:定义一个队列,先把头节点压入队列 3:while循环判断队列是否为空不为空进入循环 4 ...

  9. 剑指offer之分行从上到下打印二叉树

    1 题目 分行从上到下打印二叉树 23 5 1 4 2 3 我们打印如下 23 51 4 2 3 2 分析 之前这篇博客写了通过队列按层打印剑指offer之按层打印树节点 现在无非就是还要按照条件打印 ...

  10. Python剑指offer:分行从上到下打印二叉树

    从上到下按层打印二叉树,同一层的节点按照从左到右 的顺序打印,每一层打印到第一行,例如本题中上一个问题的二叉树 输出形式会是: 8 6 10 5 7 9 11 这道题和前面一道题十分类似,也可以用一个 ...

最新文章

  1. 【GVA】gorm多对多many2many删除数据的同时级联删除关联中间表中的关联数据
  2. 小米合作鸿蒙系统了么,小米等国产手机会使用鸿蒙系统吗?
  3. go + influxdb + grafana 日志监控系统
  4. 属性 元素的内容 创建,插入和删除节点 虚拟节点
  5. Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)
  6. 使用java类加载器,报异常java.nio.file.InvalidPathException
  7. 深夜,基友给我发了个某短视频app,我没忍住把它给...
  8. 2022-02-09大数据学习日志——Hadoop离线阶段——Hive窗口函数、性能调优
  9. Android 身份证号码校验
  10. docker nginx反向代理配置内部端口502 bad gateway
  11. ElasticSearch进阶(五)MetricBeat的简单使用
  12. matlab字号单位是磅吗,Office软件中字体“号”与“磅”的关系
  13. Android游戏开发之小球重力感应实现
  14. 2项密评新标准6月1日实施(附图解幻灯片下载)
  15. 网页嵌入flash动画视频的几种方法
  16. 解决Docker镜像缺少字体的问题
  17. 电子商务新发展 海峡两岸智富惠论坛今日在厦召开
  18. 基于移动终端的大学生心理健康交互管理系统的研究与设计
  19. 10.1 单片机数字秒表程序
  20. 如何轻松快速搭建商城系统?

热门文章

  1. adb 查看当前包名和Activity
  2. 关于JUnit5 你必须知道的(二)JUnit 5的新特性
  3. 关于WebRTC发展的担忧和思考
  4. AOM Summit 来了
  5. 移动音视频SDK工程实践之数据采集和处理
  6. Netflix:如何通过机器学习提高流媒体质量?
  7. 剑指offer之26-30题解
  8. Java多线程之多线程工程代码编写思维方式
  9. 最新开源:3TS腾讯事务处理技术验证系统(下)
  10. Amazon S3和Swift鉴权机制分析