leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)
题目
思路
一个比较啰嗦的解法
- 维护两个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(维护两个队列,通过异或运算切换)相关推荐
- 二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II
题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/ 题目描述: 给定一个二叉树,返回其节点值自底 ...
- LeetCode 107. 二叉树的层次遍历 II(队列)
1. 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 ...
- Leetcode 107. 二叉树的层次遍历 II 解题思路及C++实现
解题思路: 使用队列实现二叉树的层序遍历,因为题目中要求每一层的val存储在一个vector中,所以在内循环中,还需要一个队列,用以存储更新每一层的节点. 在最后,需要将得到的res数组逆序. /** ...
- 47. Leetcode 107 - 二叉树的层次遍历 ii (二叉树-二叉树遍历)
给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)示例 1:输入:root = [3,9,20,null,null,15, ...
- 107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ ...
- 107. 二叉树的层次遍历 II(JavaScript)
给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,null,15,7], 3/ \9 20/ ...
- Leetcode 107.二叉树的层序遍历 II (每日一题 20210628 同类型题)
给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \1 ...
- 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
- 【每日一算法】二叉树的层次遍历 II
每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...
最新文章
- 《乐高EV3机器人搭建与编程》——2.2 颜色设计
- 只学python找工作难吗-只学python语言找工作难吗?
- VB6.0使用ADO对象连接数据库
- 页面滚动到指定class样式位置
- 计算机背板知识,你知道背板的选购技巧吗?
- (16)System Verilog联合体union详解
- 微信小程序 腾讯云ocr 身份证识别
- word删除空白页的6种方法和技巧
- html敲tab键无法新建,sublime按tab键无法补全html页面模板解决办法
- JS--历史搜索记录的实现
- iOS开发 - 使用IJKPlayer时,关于需求要边下边播的缓存功能,退回来后播放缓存不再耗流量
- POSCMS 短信设置
- 物体识别全流程(Ubuntu16.04)结合ROS
- Android知乎广告效果
- 列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
- 如何上架自己的应用到各大应用商店?
- 同时删除多个 Txt 文本文档的前几行
- Node.js到底是什么?
- 运算器设计(Logisim实现)
- 【滤波器】各种滤波器的理解与学习