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

優質博文:IT-BLOG-CN

一、題目

給你二叉樹的根節點root,返回其節點值的 層序遍歷 。(即逐層地,從左到右訪問所有節點)。

示例 1:

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

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

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

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

二、代碼

廣度優先搜索: 我們可以用廣度優先搜索解決這個問題。我們可以想到最樸素的方法是用一個二元組(node, level)來表示狀態,它表示某個節點和它所在的層數,每個新進隊列的節點的level值都是父親節點的level值加一。最后根據每個點的level對點進行分類,分類的時候我們可以利用哈希表,維護一個以level為鍵,對應節點值組成的數組為值,廣度優先搜索結束以后按鍵level從小到大取出所有值,組成答案返回即可。

考慮如何優化空間開銷:如何不用哈希映射,并且只用一個變量node表示狀態,實現這個功能呢?

我們可以用一種巧妙的方法修改廣度優先搜索:
1、首先根元素入隊
2、當隊列不為空的時候:求當前隊列的長度si;依次從隊列中取si個元素進行拓展,然后進入下一次迭代;

它和普通廣度優先搜索的區別在于,普通廣度優先搜索每次只取一個元素拓展,而這里每次取si個元素。在上述過程中的第i次迭代就得到了二叉樹的第i層的si個元素。

為什么這么做是對的呢?我們觀察這個算法,可以歸納出這樣的循環不變式:第i次迭代前,隊列中的所有元素就是第i層的所有元素,并且按照從左向右的順序排列。證明它的三條性質(你也可以把它理解成數學歸納法):
【1】初始化: i=1的時候,隊列里面只有root,是唯一的層數為1的元素,因為只有一個元素,所以也顯然滿足「從左向右排列」;
【2】保持: 如果i=k時性質成立,即第k輪中出隊sk的元素是第k層的所有元素,并且順序從左到右。因為對樹進行廣度優先搜索的時候由低k層的點拓展出的點一定也只能是k+1層的點,并且k+1層的點只能由第k層的點拓展到,所以由這sk個點能拓展到下一層所有的sk+1個點。又因為隊列的先進先出(FIFO)特性,既然第k層的點的出隊順序是從左向右,那么第k+1層也一定是從左向右。至此,我們已經可以通過數學歸納法證明循環不變式的正確性。
【3】終止: 因為該循環不變式是正確的,所以按照這個方法迭代之后每次迭代得到的也就是當前層的層次遍歷結果。至此,我們證明了算法是正確的。

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<List<Integer>>();if (root == null) {return ret;}Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {List<Integer> level = new ArrayList<Integer>();int currentLevelSize = queue.size();for (int i = 1; i <= currentLevelSize; ++i) {TreeNode node = queue.poll();level.add(node.val);if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}ret.add(level);}return ret;}
}

時間復雜度: 每個點進隊出隊各一次,故漸進時間復雜度為O(n)
空間復雜度: 隊列中元素的個數不超過n個,故漸進空間復雜度為O(n)

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

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

相關文章

設計模式的定義

1 組合模式: 整體-部分模式,它是一種將對象組合成樹狀層次結構的模式,用來表示整體和部分的關系,使用戶對單個對象和組合對象具有一致的訪問性,屬于結構型設計模式 1.1 特點: 組合模式使得客戶端代碼可以一致的處理單個對象和組合對象更容易在組合體內加入新的對象,客戶端不…

【數據挖掘】工具整理 - 期刊 - 會議 - 論壇/博客 - 數據集

文章目錄 1 期刊2 會議3 論壇/博客4 數據集 1 期刊 Data Mining and Knowledge Discovery (DMKD)IEEE Transactions on Knowledge and Data Engineering (TKDE)Knowledge and Information Systems(KAIS)IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAM…

二叉樹的遍歷之迭代遍歷

前言&#xff1a;在學習二叉樹的時候我們基本上已經了解過二叉樹的三種遍歷&#xff0c;對于這三種遍歷&#xff0c;我們采用遞歸的思路&#xff0c;很簡單的就能實現&#xff0c;那么如何用迭代的方法去解決問題&#xff1f; 我們首先來看第一個&#xff1a; 前序遍歷 144.…

【計算機網絡學習之路】HTTP請求

目錄 前言 HTTP請求報文格式 一. 請求行 HTTP請求方法 GET和POST的區別 URL 二. 請求頭 常見的Header 常見的額請求體數據類型 三. 請求體 結束語 前言 HTTP是應用層的一個協議。實際我們訪問一個網頁&#xff0c;都會像該網頁的服務器發送HTTP請求&#xff0c;服務…

chrome 調試之 - 給微軟小冰看病(無論給小冰發送什么內容都只回復“我已經開始升級啦,期待一下吧!”)

微軟 Bing 搜索推出了小冰AI智能聊天模塊&#xff0c;具體啟用方式是用edge或chrome瀏覽器打開鏈接 cn.bing.com 后在輸入框搜索任意內容&#xff0c;待搜索結果頁面加載完并稍等片刻&#xff0c;頁面右側就會出現一個躲在滾動條后面的小蘿莉&#xff0c;撫摸...不&#xff0c;…

Java-網絡通信總結

文章目錄 網絡程序設計基礎局域網與互聯網 網絡協議IP協議TCP/IP 協議端口域套接字 TCP 程序InterAddress 類ServerSocket 類 UDP 程序DatagramPacket 類DatagramSocket 類 網絡程序設計基礎 網絡程序設計編寫的是與其他計算機進行通信的程序。Java 已經將網絡程序所需要的元素…

RK3588平臺開發系列講解(hardware)reference-ril源碼分析

平臺內核版本安卓版本RK3588Linux 5.10Android 12文章目錄 一、reference-ril目錄介紹二、支持的功能三、Android RIL 框架沉淀、分享、成長,讓自己和他人都能有所收獲!?? 一、reference-ril目錄介紹 目錄:3588-android12/hardware/ril/reference-ril

ElementUI 時間選擇器如何限定選擇時間

DatePicker 日期選擇器 | Element Plus 我們如何限定我們的選擇時間呢&#xff0c;比如限定選擇時間為今天之前&#xff0c;或者今天之后的時間&#xff1f; 我們可以使用官方提供的disabled-date來實現 我們通過這個屬性 做一個回調函數&#xff0c;在里面比較我們想要限定的時…

MongoDB數據建模與文檔設計

目錄 1. 文檔數據庫的概念 2. 數據建模的最佳實踐 3. 復雜文檔結構的設計 4. Java代碼實踐 1. 文檔數據庫的概念 MongoDB文檔模型&#xff1a; MongoDB是一種文檔數據庫&#xff0c;它以BSON&#xff08;Binary JSON&#xff09;格式存儲數據。文檔是MongoDB中基本的數據單…

#HarmonyOS:基礎語法

基礎語法 定義了聲明式UI描述&#xff1b; 自定義組件&#xff1b; 動態擴展UI元素的能力&#xff1b; 狀態管理 多維度裝填管理機制&#xff1b;父子組件間爺孫組件間全局范圍內傳遞跨設備傳遞只讀的單向傳遞可變的雙向傳遞 渲染控制 UI描述&#xff1a;以聲明式的方式來…

鴻蒙方舟開發框架ArkUI簡介

語雀知識庫地址&#xff1a;語雀HarmonyOS知識庫 飛書知識庫地址&#xff1a;飛書HarmonyOS知識庫 嗨&#xff0c;各位別來無恙吶&#xff0c;我是小白 眾所周知&#xff0c;華為在今年推出了 HarmonyOS 4.0 版本&#xff0c;而在此之前的版本中&#xff0c;HarmonyOS 應用的 …

2024年AI視頻識別技術的6大發展趨勢預測

隨著人工智能技術的快速發展&#xff0c;AI視頻識別技術也將會得到進一步的發展和應用。2023年已經進入尾聲&#xff0c;2024年即將來臨&#xff0c;那么AI視頻識別技術又將迎來怎樣的發展趨勢&#xff1f;本文將對2023年的AI視頻技術做一個簡單的盤點并對2024年的發展趨勢進行…

Advanced Renamer

Advanced Renamer 安裝鏈接 1.前后添加字符 2.字符轉數字&#xff0c;編號整體加減

oracle實驗2023-12-8--觸發器

第十四周實驗 【例】功能要求&#xff1a;增加一新表XS_1&#xff0c;表結構和表XS相同&#xff0c;用來存放從XS表中刪除的記錄。 分析: 1、創建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated題目&a…

StoneDB-8.0-V2.2.0 企業版正式發布!性能優化,穩定性提升,持續公測中!

? 11月&#xff0c;StoneDB 新版本如期而至&#xff0c;這一個月來我們的研發同學加班加點&#xff0c;持續迭代&#xff1a;在 2.2.0 版本中&#xff0c;我們針對用戶提出的需求和做出了重量級更新&#xff0c;修復了一些已知和用戶反饋的 Bug&#xff0c;同時對部分代碼進行…

PairLIE論文閱讀筆記

PairLIE論文閱讀筆記 論文為2023CVPR的Learning a Simple Low-light Image Enhancer from Paired Low-light Instances.論文鏈接如下&#xff1a; openaccess.thecvf.com/content/CVPR2023/papers/Fu_Learning_a_Simple_Low-Light_Image_Enhancer_From_Paired_Low-Light_Instan…

Kafka安全性探究:構建可信賴的分布式消息系統

在本文中&#xff0c;將研究Kafka的安全性&#xff0c;探討如何確保數據在傳輸和存儲過程中的完整性、機密性以及授權訪問。通過詳實的示例代碼&#xff0c;全面討論Kafka安全性的各個方面&#xff0c;從加密通信到訪問控制&#xff0c;幫助大家構建一個可信賴的分布式消息系統…

vue3 setup router的使用教程

vue3 setup router的使用教程 文章目錄 vue3 setup router的使用教程1. 安裝2. 使用&#xff08;創建路由實例&#xff09;3. 路由跳轉3.1 通過router-link標簽跳轉3.2 通過js代碼跳轉 4. 接收參數4.1 通過query接收參數4.2 通過params接收參數 5. 路由守衛5.1 全局守衛5.2 路由…

阿里云docker加速

文章目錄 一、 阿里云鏡像倉庫配置二、配置加速1. CentOS2. Mac3. Windows注意 一、 阿里云鏡像倉庫配置 1.注冊阿里云賬號&#xff0c;并登陸到阿里云后臺&#xff0c;進入控制臺面板 2.進入控制臺以后&#xff0c;找到左上方的三橫的功能列表按鈕&#xff0c;在彈出來的功能…

智能手機IC

智能手機IC 電子元器件百科 文章目錄 智能手機IC前言一、智能手機IC是什么二、智能手機IC的類別三、智能手機IC應用實例四、智能手機IC作用總結前言 智能手機IC通過相互配合和協同工作,支持智能手機的各種功能和特性,如高速計算、多媒體處理、無線通信、圖形渲染、傳感器數據…