【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III
立志用最少的代码做最高效的表达
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [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相关推荐
- 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II
[LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...
- 【简洁+注释】剑指 Offer 32 - II. 从上到下打印二叉树 II
立志用最少的代码做最高效的表达 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回其层次遍历结果 ...
- 【简洁写法】剑指 Offer 32 - I. 从上到下打印二叉树
立志用最少的代码做最高效的表达 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回: [3,9,20,1 ...
- 剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 20/ \15 7 返回: [3,9,20,1 ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
2020-06-22 1.题目描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 2.题解 广度优先搜索,即层次遍历即可 3.代码 /*** Definition fo ...
- JZ32变形~剑指 Offer 32 - II. 从上到下打印二叉树 II
放假不学习/上班,学习不放假.放假当然是不能学习或工作啦
- 剑指 Offer 32 - I. 从上到下打印二叉树(Java迭代法实现)
给定二叉树: [3,9,20,null,null,15,7] 找下规律, 发现队列可以实现层次遍历, 比如根节点3先入队,再将队列的第一个节点出队,并将出队的左右子节点(不为空)入队,直到队列为空. ...
- LeetCode-剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树 思路一:BFS广度优先遍历 1: 定义一个res返回值 2:定义一个队列,先把头节点压入队列 3:while循环判断队列是否为空不为空进入循环 4 ...
- 剑指offer之分行从上到下打印二叉树
1 题目 分行从上到下打印二叉树 23 5 1 4 2 3 我们打印如下 23 51 4 2 3 2 分析 之前这篇博客写了通过队列按层打印剑指offer之按层打印树节点 现在无非就是还要按照条件打印 ...
- Python剑指offer:分行从上到下打印二叉树
从上到下按层打印二叉树,同一层的节点按照从左到右 的顺序打印,每一层打印到第一行,例如本题中上一个问题的二叉树 输出形式会是: 8 6 10 5 7 9 11 这道题和前面一道题十分类似,也可以用一个 ...
最新文章
- 【GVA】gorm多对多many2many删除数据的同时级联删除关联中间表中的关联数据
- 小米合作鸿蒙系统了么,小米等国产手机会使用鸿蒙系统吗?
- go + influxdb + grafana 日志监控系统
- 属性 元素的内容 创建,插入和删除节点 虚拟节点
- Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)
- 使用java类加载器,报异常java.nio.file.InvalidPathException
- 深夜,基友给我发了个某短视频app,我没忍住把它给...
- 2022-02-09大数据学习日志——Hadoop离线阶段——Hive窗口函数、性能调优
- Android 身份证号码校验
- docker nginx反向代理配置内部端口502 bad gateway
- ElasticSearch进阶(五)MetricBeat的简单使用
- matlab字号单位是磅吗,Office软件中字体“号”与“磅”的关系
- Android游戏开发之小球重力感应实现
- 2项密评新标准6月1日实施(附图解幻灯片下载)
- 网页嵌入flash动画视频的几种方法
- 解决Docker镜像缺少字体的问题
- 电子商务新发展 海峡两岸智富惠论坛今日在厦召开
- 基于移动终端的大学生心理健康交互管理系统的研究与设计
- 10.1 单片机数字秒表程序
- 如何轻松快速搭建商城系统?