【问题描述】[中等]

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],3/ \9  20/  \15   7
返回其层次遍历结果:
[[3],[20,9],[15,7]
]提示:节点总数 <= 1000

【解答思路】

1. 层序遍历 + 倒序


时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();List<List<Integer>> res = new ArrayList<>();if(root != null) queue.add(root);while(!queue.isEmpty()) {List<Integer> tmp = new ArrayList<>();for(int i = queue.size(); i > 0; i--) {TreeNode node = queue.poll();tmp.add(node.val);if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);}if(res.size() % 2 == 1) Collections.reverse(tmp);res.add(tmp);}return res;}
}
2. 层序遍历 + 双端队列


时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();List<List<Integer>> res = new ArrayList<>();if(root != null) queue.add(root);while(!queue.isEmpty()) {LinkedList<Integer> tmp = new LinkedList<>();for(int i = queue.size(); i > 0; i--) {TreeNode node = queue.poll();if(res.size() % 2 == 0) tmp.addLast(node.val); // 偶数层 -> 队列头部else tmp.addFirst(node.val); // 奇数层 -> 队列尾部if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);}res.add(tmp);}return res;}
}
3. 层序遍历 + 双端队列(奇偶层逻辑分离)


时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {Deque<TreeNode> deque = new LinkedList<>();List<List<Integer>> res = new ArrayList<>();if(root != null) deque.add(root);while(!deque.isEmpty()) {// 打印奇数层List<Integer> tmp = new ArrayList<>();for(int i = deque.size(); i > 0; i--) {// 从左向右打印TreeNode node = deque.removeFirst();tmp.add(node.val);// 先左后右加入下层节点if(node.left != null) deque.addLast(node.left);if(node.right != null) deque.addLast(node.right);}res.add(tmp);if(deque.isEmpty()) break; // 若为空则提前跳出// 打印偶数层tmp = new ArrayList<>();for(int i = deque.size(); i > 0; i--) {// 从右向左打印TreeNode node = deque.removeLast();tmp.add(node.val);// 先右后左加入下层节点if(node.right != null) deque.addFirst(node.right);if(node.left != null) deque.addFirst(node.left);}res.add(tmp);}return res;}
}

【总结】

1.细节

1.1 Queue
新建

  // Queue<TreeNode> queue=  new LinkedList<>();//queue.add(root);Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};

入队出队 add(x) poll()

1.2 ArrayList
新建
ArrayList ans = new ArrayList<>();
长度 size()
获取元素 get(i)

2. Queue


Queue是在两端出入的List,所以也可以用数组或链表来实现。

  • add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  • remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • offer 添加一个元素并返回true 如果队列已满,则返回false
  • poll 移除并返问队列头部的元素 如果队列为空,则返回null
  • peek 返回队列头部的元素 如果队列为空,则返回null
  • put 添加一个元素 如果队列满,则阻塞
  • take 移除并返回队列头部的元素 如果队列为空,则阻塞
注意
  • remove、element、offer 、poll、peek 其实是属于Queue接口。

  • add remove element操作在队满或者队空的时候会报异常。

  • offer poll peek 在队满或者队空的时候不会报异常。

  • put take操作属于阻塞操作。队满队空均会阻塞。

3.LinkedList
  • 以双向链表实现的LinkedList既是List,也是Queue。
  • 它是唯一一个允许放入null的Queue。
4.BFS 层次遍历 队列实现

转载链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er–3/

[剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]相关推荐

  1. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

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

  2. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  3. 【剑指offer】面试题32 - I:从上到下打印二叉树(Java)

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

  4. 【剑指offer】面试题32 - III:从上到下打印二叉树 III(Java)

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,null, ...

  5. 【剑指offer】面试题32 - II:从上到下打印二叉树 II(Java)

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

  6. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  7. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

  8. [剑指offer][JAVA]面试题[51][数组中的逆序对][归并排序]

    [问题描述]面试题51.数组中的逆序对 (困难) 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1:输入: [7, ...

  9. 【博客搬家旧文】剑指offer [ java ] 面试题10 斐波那契数列

    契波那契数列最常见的解法,递归如下: public class Solution {public int Fibonacci(int n) {if(n == 0)return 0;else if(n ...

最新文章

  1. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
  2. IIS7 设置读取、脚本和可执行文件的执行权限的步骤
  3. 记录一次缓存系统的优化过程
  4. SSM关联码表的多个字段显示中文流程以及sql写法
  5. AtCoder AGC004F Namori (图论)
  6. Nginx(三):负载均衡策略 与 Nginx静态服务器
  7. 利用JS实现复制/粘贴功能
  8. 关闭钩子(ShutdownHook)
  9. oracle存档模式,Oracle的备份和存档模式
  10. 计算机网络作业6,计算机网络作业 6
  11. java record用法_JDBM学习八(Record)
  12. 计算机等级考试c语言 真题,计算机等级考试二级C语言真题
  13. Java项目--网页版音乐播放器(JQuery前端逻辑)
  14. gain在matlab里什么意思,gain gray是什么意思
  15. NVIDIA Jetson之PWM风扇自定义控制
  16. LED数码管段码生成
  17. mysql截取字符串后缀_Mysql字符串截取函数SUBSTRING的用法说明
  18. 【java】Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法!
  19. 11_ue4天空球的使用
  20. sql2005数据库添加外键级联删除外键对应的主键行

热门文章

  1. shape的简单用法
  2. 【转】成为Java顶尖程序员 ,看这10本书就够了
  3. OC --(5)-- 字典、集、数组排序:字典类、集合类、数组数组排序、字典、集合的快速遍历、数组排序...
  4. sublime text3下BracketHighlighter的配置方法
  5. win10使用docker desktop安装k8s一直starting解决方法
  6. 开发模式下浏览器不支持ES6
  7. android 自定义相机,Camera,相机遮罩层
  8. android 三星 白色,时尚实用都拥有 白色Android手机盘点
  9. mysql中新建不了查询语句_将excel和mysql建立链接后,如何通过在excel里面执行mysql查询语句,然后建立查询...
  10. 实验16 编写包含多个功能子程序的中断例程