二叉樹的鋸齒形層序遍歷[中等]

優質博文:IT-BLOG-CN

一、題目

給你二叉樹的根節點 root ,返回其節點值的 鋸齒形層序遍歷 。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

示例 1:

輸入:root = [3,9,20,null,null,15,7]
輸出:[[3],[20,9],[15,7]]

示例 2:
輸入:root = [1]
輸出:[[1]]

示例 3:
輸入:root = []
輸出:[]

樹中節點數目在范圍[0, 2000]
-100 <= Node.val <= 100

二、代碼

廣度優先遍歷: 規定二叉樹的根節點為第0層,如果當前層數是偶數,從左至右輸出當前層的節點值,否則,從右至左輸出當前層的節點值。我們依然可以沿用第102題的思想,修改廣度優先搜索,對樹進行逐層遍歷,用隊列維護當前層的所有元素,當隊列不為空的時候,求得當前隊列的長度 size,每次從隊列中取出size個元素進行拓展,然后進行下一次迭代。

為了滿足題目要求的返回值為「先從左往右,再從右往左」交替輸出的鋸齒形,我們可以利用「雙端隊列」的數據結構來維護當前層節點值輸出的順序。

雙端隊列是一個可以在隊列任意一端插入元素的隊列。在廣度優先搜索遍歷當前層節點拓展下一層節點的時候我們仍然從左往右按順序拓展,但是對當前層節點的存儲我們維護一個變量isOrderLeft記錄是從左至右還是從右至左的:
【1】如果從左至右,我們每次將被遍歷到的元素插入至雙端隊列的末尾。
【2】如果從右至左,我們每次將被遍歷到的元素插入至雙端隊列的頭部。

當遍歷結束的時候我們就得到了答案數組。

class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> ans = new LinkedList<List<Integer>>();if (root == null) {return ans;}Queue<TreeNode> nodeQueue = new ArrayDeque<TreeNode>();nodeQueue.offer(root);boolean isOrderLeft = true;while (!nodeQueue.isEmpty()) {Deque<Integer> levelList = new LinkedList<Integer>();int size = nodeQueue.size();for (int i = 0; i < size; ++i) {TreeNode curNode = nodeQueue.poll();if (isOrderLeft) {levelList.offerLast(curNode.val);} else {levelList.offerFirst(curNode.val);}if (curNode.left != null) {nodeQueue.offer(curNode.left);}if (curNode.right != null) {nodeQueue.offer(curNode.right);}}ans.add(new LinkedList<Integer>(levelList));isOrderLeft = !isOrderLeft;}return ans;}
}

時間復雜度: 其中N為二叉樹的節點數。每個節點會且僅會被遍歷一次。
空間復雜度: O(N)。我們需要維護存儲節點的隊列和存儲節點值的雙端隊列,空間復雜度為O(N)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210354.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

認識線程和創建線程

目錄 1.認識多線程 1.1線程的概念 1.2進程和線程 1.2.1進程和線程用圖描述關系 1.2.2進程和線程的區別 1.3Java 的線程和操作系統線程的關系 2.創建線程 2.1繼承 Thread 類 2.2實現 Runnable 接口 2.3匿名內部類創建 Thread 子類對象 2.4匿名內部類創建 Runnable 子類對…

使用貝葉斯網絡檢測因果關系,提升模型效果更科學(附Python代碼)

雖然機器學習技術可以實現良好的性能&#xff0c;但提取與目標變量的因果關系并不直觀。換句話說&#xff0c;就是&#xff1a;哪些變量對目標變量有直接的因果影響&#xff1f; 機器學習的一個分支是貝葉斯概率圖模型(Bayesian probabilistic graphical models)&#xff0c;也…

【Com通信】Com模塊詳細介紹

目錄 前言 1. Com模塊功能介紹 2.關鍵概念理解 3.功能詳細設計 3.1 Introduction 3.2 General Functionality 3.2.1 AUTOSAR COM basis 3.2.2 Signal Values 3.2.3 Endianness Conversion and Sign Extension 3.2.4 Filtering 3.2.5 Signal Gateway 3.3 Normal Ope…

2.2 網絡多線程(私聊、群發、發送文件、推送新聞、離線留言)

文章目錄 一、私聊1.1 分析1.2 客戶端1.2.1 MessageClientService 私聊類1.2.2 ClientConnectServerThread 線程類 1.3 服務端1.3.1 ServerConnectClientThread 線程類 1.4功能演示 二、群發消息2.1 分析2.2 客戶端2.2.1 MessageClientService類2.2.2 ClientConnectServerThrea…

1.1.1.多線程的發展--對cpu性能的壓榨史

一.壓榨歷史 1.單進程人工切換。紙帶機。只能解決簡單的數學問題。 2.單道批處理。多進程批處理。多個任務批量執行。解決手動操作時需要人工切換作業導致的系統利用率低的問題 3.多進程并行處理。把程序寫在不同的內存位置來回切換。當一個作業在等待I/O處理時&#xff0c;…

C語言-函數STRCPY

strcpy char *strcpy(char *restrict dst, const char *restrict src);把src的字符串拷貝到dst restrict表明src和dst不重疊&#xff08;C99&#xff09; 返回dst 為了能鏈起代碼來 復制一個字符串 char dst (char)malloc(strlen(src) 1); strcpy(dst, src);

從單向鏈表中刪除指定值的節點

輸入一個單向鏈表和一個節點的值&#xff0c;從單向鏈表中刪除等于該值的節點&#xff0c;刪除后如果鏈表中無節點則返回空指針。 鏈表的值不能重復。構造過程&#xff0c;例如輸入一行數據為:6 2 1 2 3 2 5 1 4 5 7 2 2則第一個參數6表示輸入總共6個節點&#xff0c;第二個參數…

通過仿真理解完整的陣列信號噪聲模型

概要 噪聲對無線電設備的信號接收會造成影響,是通信、雷達、導航、遙感等工程應用領域中的關鍵考慮因素。通常認為陣列合成能夠提升信噪比,但忽略了這一論斷的前提,即不同通道引入的噪聲互不相關。但實際應用中,接收的噪聲不僅僅包含信道引入的不相關噪聲,還包含從外界環…

1-6、編程語言排行榜

語雀原文鏈接 https://www.tiobe.com/tiobe-index/

IntelliJ IDEA創建一個Maven項目

在IDEA中創建Maven項目&#xff0c;前提是已經安裝配置好Maven環境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.創建一個新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 創建好的工程如下&#xff1a; src/main…

使用NanoPi NEO4進行rtsp拉流

使用系統&#xff1a;FriendlyDesktop系統 使用python進行編程&#xff0c;分別使用opencv與ffmpeg進行功能實現&#xff0c;折騰了挺長時間&#xff0c;代碼很簡單&#xff0c;主要是環境搭建。主要是python、opencv-python、ffmpeg-python、numpy之間的版本兼容&#xff0c;…

Chart 8 內核優化

文章目錄 前言8.1 內核融合和拆分8.2 編譯選項8.3 Conformant&#xff08;規范&#xff09; vs. fast vs. native math functions8.4 Loop unrolling8.5 避免分支發散8.6 Handle image boundaries8.7 Avoid the use of size_t8.8 通用 vs. 具名內存地址空間8.9 Subgroup8.10 Us…

七個常用<python裝飾器>---足夠改進代碼質量 (保姆詳解)

前言: 寫代碼嘛&#xff0c;關鍵是得讓它既好用又好看&#xff0c;這不&#xff0c;Python裝飾器就擺在那兒。咱們程序員有時也得有那么點藝術家的腔調&#xff1a;講求效率&#xff0c;追求代碼的簡潔優雅&#xff0c;偶爾還得裝裝X&#xff0c;不是嗎&#xff1f; 翻開人家…

SpringSecurity6 | 自定義認證規則

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Java從入門到精通 ?特色專欄&#xf…

移相干涉技術1-多種干涉條紋仿真模擬生成(原理轉載+代碼實現 包括模擬生成干涉條紋圖)

過去的干涉測量技術是通過人的肉眼或者相機拍攝&#xff0c;來直觀判斷干涉圖中條紋特征進而完成測量&#xff0c;該方法的不穩定因素&#xff08;比如人的主觀意志&#xff09;很多&#xff0c;其精度誤差在/10左右38]&#xff1b;現代干涉測量技術通過將電子技術、計算機技術…

智能優化算法應用:基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于廚師算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.廚師算法4.實驗參數設定5.算法結果6.參考文獻7.MATLAB…

代碼隨想錄-刷題第二十一天

530.二叉搜索樹的最小絕對差 題目鏈接&#xff1a;530. 二叉搜索樹的最小絕對差 思路&#xff1a;二叉搜索樹的中序遍歷是有序的。根據二叉搜索樹的這個特性來解題。 class Solution {// 同樣利用二叉樹中序遍歷是一個有序數組。private List<Integer> list new Arra…

一加 12 Pop-up快閃活動來襲,十城聯動火爆開啟

12 月 9 日&#xff0c;一加 12 Pop-up 快閃活動在北京、深圳、上海、廣州等十城聯動開啟&#xff0c;各地加油歡聚快閃現場&#xff0c;搶先體驗與購買一加 12。作為一加十年超越之作&#xff0c;一加 12 全球首發擁有醫療級護眼方案和行業第一 4500nit 峰值亮度的 2K 東方屏、…

C++新經典模板與泛型編程:策略類模板

策略類模板 在前面的博文中&#xff0c;策略類SumPolicy和MinPolicy都是普通的類&#xff0c;其中包含的是一個靜態成員函數模板algorithm()&#xff0c;該函數模板包含兩個類型模板參數。其實&#xff0c;也可以把SumPolicy和MinPolicy類寫成類模板—直接把algorithm()中的兩…

【Linux】無法使用 ifconfig 查看系統網絡接口信息,報錯 command not found: ifconfig

問題描述 ifconfig是一個用于配置和顯示系統網絡接口信息的命令行工具。它通常用于Unix、Linux和其他類Unix系統中。 通過ifconfig命令&#xff0c;你可以查看和修改系統中網絡接口的配置信息&#xff0c;包括IP地址、子網掩碼、MAC地址、MTU&#xff08;最大傳輸單元&#x…