题目

思路

一个比较啰嗦的解法

  • 维护两个queue,当前队列节点的孩子,都放进另外一个队列里去
  • 树每切换一层,就切换一次队列,并且把新队列的值全部存起来
  • 整体上来看,是自顶向下遍历,最后翻转整个list。

这个思路太复杂了,不要学我
全篇代码唯一的亮点,是通过^1(二进制异或1)操作进行0与1之间的快速切换。所谓异或,相同为0,不同为1。

题解1

import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;// Definition for a binary tree node.
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}@Overridepublic String toString() {return "TreeNode{" +"val=" + val +'}';}
}class Solution {// 测试用例//             1//            / \//           2   2//          / \ / \//         ~  6 7  8public static void main(String[] args) {Solution solution = new Solution();TreeNode n1 = new TreeNode(1);TreeNode n21 = new TreeNode(2);TreeNode n22 = new TreeNode(2);
//        TreeNode n31 = new TreeNode(3);TreeNode n32 = new TreeNode(6);TreeNode n33 = new TreeNode(7);TreeNode n34 = new TreeNode(8);n1.left = n21;n1.right = n22;
//        n21.left = n31;n21.right = n32;n22.left = n33;n22.right = n34;List<List<Integer>> list = solution.levelOrderBottom(n1);System.out.println(list);}public List<List<Integer>> levelOrderBottom(TreeNode root) {//自顶向下的层次遍历,最后再reverseList<List<Integer>> list = new ArrayList<>();//维护两个队列,树每切换一层,就翻转一下队列LinkedList<TreeNode> q1 = new LinkedList();LinkedList<TreeNode> q2 = new LinkedList();ArrayList<LinkedList<TreeNode>> twoQ = new ArrayList();twoQ.add(q1);twoQ.add(q2);int Q = 1;//标记当前使用的队列,通过^1异或运算符进行0,1之间的切换(二进制异或,相同为0,不同为1)if (root != null) {twoQ.get(Q).push(root);ArrayList<Integer> ll = new ArrayList<>();ll.add(root.val);list.add(ll);}while (!twoQ.get(Q).isEmpty()) {TreeNode node = twoQ.get(Q).pop();//取尾部if (node.left != null) twoQ.get(Q ^ 1).add(node.left);//放头部if (node.right != null) twoQ.get(Q ^ 1).add((node.right));if (twoQ.get(Q).isEmpty()) { // 如果当前queue为空,就切换另一个queueQ ^= 1;if (twoQ.get(Q).isEmpty()) break; // 两queue皆空,退出循环ArrayList<Integer> oneLayer = new ArrayList<>();for (TreeNode tn : twoQ.get(Q)) // 将切换后的新 queue 的值全部保存,相当于存了树的一层oneLayer.add(tn.val);list.add(oneLayer);}}Collections.reverse(list);return list;}
}

题解2(来自评论区)

每次都从queue中取出一层的数据,存好一层的个数,到达数量之后就flush一下。
一个count解决,不用像我上面的解法那样,去维护两个队列了。

    public List<List<Integer>> levelOrderBottom(TreeNode root) {LinkedList<List<Integer>> result = new LinkedList<>();if (root == null)return result;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {List<Integer> oneLevel = new ArrayList<>();// 每次都取出一层的所有数据int count = queue.size();for (int i = 0; i < count; i++) {TreeNode node = queue.poll();oneLevel.add(node.val);if (node.left != null)queue.add(node.left);if (node.right != null)queue.add(node.right);}// 每次都往队头塞result.addFirst(oneLevel);}return result;}

leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)相关推荐

  1. 二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

    题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/ 题目描述: 给定一个二叉树,返回其节点值自底 ...

  2. LeetCode 107. 二叉树的层次遍历 II(队列)

    1. 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 ...

  3. Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现

    解题思路: 使用队列实现二叉树的层序遍历,因为题目中要求每一层的val存储在一个vector中,所以在内循环中,还需要一个队列,用以存储更新每一层的节点. 在最后,需要将得到的res数组逆序. /** ...

  4. 47. Leetcode 107 - 二叉树的层次遍历 ii (二叉树-二叉树遍历)

    给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例 1:输入:root = [3,9,20,null,null,15, ...

  5. 107. 二叉树的层次遍历 II

    给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ ...

  6. 107. 二叉树的层次遍历 II(JavaScript)

    给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ ...

  7. Leetcode 107.二叉树的层序遍历 II (每日一题 20210628 同类型题)

    给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \1 ...

  8. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  9. 【每日一算法】二叉树的层次遍历 II

    每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...

最新文章

  1. 《乐高EV3机器人搭建与编程》——2.2 颜色设计
  2. 只学python找工作难吗-只学python语言找工作难吗?
  3. VB6.0使用ADO对象连接数据库
  4. 页面滚动到指定class样式位置
  5. 计算机背板知识,你知道背板的选购技巧吗?
  6. (16)System Verilog联合体union详解
  7. 微信小程序 腾讯云ocr 身份证识别
  8. word删除空白页的6种方法和技巧
  9. html敲tab键无法新建,sublime按tab键无法补全html页面模板解决办法
  10. JS--历史搜索记录的实现
  11. iOS开发 - 使用IJKPlayer时,关于需求要边下边播的缓存功能,退回来后播放缓存不再耗流量
  12. POSCMS 短信设置
  13. 物体识别全流程(Ubuntu16.04)结合ROS
  14. Android知乎广告效果
  15. 列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
  16. 如何上架自己的应用到各大应用商店?
  17. 同时删除多个 Txt 文本文档的前几行
  18. Node.js到底是什么?
  19. 运算器设计(Logisim实现)
  20. 【滤波器】各种滤波器的理解与学习

热门文章

  1. EOJ_1039_最长连续公共子序列
  2. 流与文件 java_java流与文件处理,请看代码:
  3. 快速获取青年大学习完成截图
  4. 利用Python编写网络爬虫下载文章
  5. IDA Pro逆向实战之Crackme(简单篇)
  6. 【Boost】boost库asio详解8——TCP的简单例子1
  7. WebRTC 的传输协议
  8. Git之删除本地无用分支
  9. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  10. 对话OTTVerse创始人Krishna Rao Vijayanagar:创业之初,挑战与机遇并存