日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/2/28 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(维护两个队列,通过异或运算切换)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。