leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)
生活随笔
收集整理的這篇文章主要介紹了
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解決,不用像我上面的解法那樣,去維護兩個隊列了。
總結
以上是生活随笔為你收集整理的leetcode 107. 二叉树的层次遍历 II(维护两个队列,通过异或运算切换)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubernetes入门到精通(二):k
- 下一篇: SPU解析优化:模块设计与实现,SKU优