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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【最佳解法】剑指 Offer 32 - III. 从上到下打印二叉树 III

發布時間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最佳解法】剑指 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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