【數據結構與算法 | 二叉樹篇】二叉樹的前中后序遍歷(迭代版本)

1. 前言

前文我們實現了二叉樹前中后三種遍歷方式的遞歸版本,非常簡單. 接下來我們來實現一下其迭代版本.

2. 二叉樹的前序遍歷

(1). 題

給你二叉樹的根節點?root?,返回它節點值的?前序?遍歷。

示例 1:

?

4f4241238c5f6f39b2eefa04fb8bf95b.jpeg

輸入:root = [1,null,2,3]
輸出:[1,2,3]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

示例 4:

?

cfa471a10c82191fbb16c9d457db515c.jpeg

輸入:root = [1,2]
輸出:[1,2]

示例 5:

?

80c0a844be1cefc61cd7412c67c5eb8d.jpeg

輸入:root = [1,null,2]
輸出:[1,2]

提示:

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

(2). 思路

遞歸調用系統棧,迭代算法自己構造一個棧來模擬. cur指針指向根節點,while循環,條件只要cur不為空并且棧不為空,不斷將元素添加到數組中(根),直到訪問到最左的葉子節點(左). 此時將其從棧彈出,訪問右節點(右). 如果該右節點為空,則繼續彈棧,訪問彈棧出的節點右節點.不斷繼續此過程.

(3). 解

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}Deque<TreeNode> stack = new LinkedList<>();TreeNode cur = root;TreeNode p;while (cur != null || !stack.isEmpty()){if (cur != null) {stack.push(cur);list.add(cur.val);cur = cur.left;} else {p = stack.pop();cur = p.right;}}return list;}
}

3. 二叉樹的中序遍歷

(1). 題

給定一個二叉樹的根節點?root?,返回?它的?中序?遍歷?。

示例 1:

?

3b2da8f54d47998c00453fdad70b070d.jpeg

輸入:root = [1,null,2,3]
輸出:[1,3,2]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

提示:

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

(2). 思路

while循環開始,如果cur不為null則一直壓棧(左),直到cur為null,彈棧,并訪問該節點(根),繼續討論該節點的右孩子(右). 繼續彈棧,該節點的左孩子部分已經完成,訪問該節點的值,繼續討論其右孩子.直到循環結束.

(3). 解

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if (root == null) {return list;}Deque<TreeNode> stack = new LinkedList<>();TreeNode cur = root;TreeNode p;while (cur != null || !stack.isEmpty()){if (cur != null) {stack.push(cur);cur = cur.left;} else {p = stack.pop();list.add(p.val);cur = p.right;}}return list;}
}

4. 二叉樹的后序遍歷

(1). 題

給你一棵二叉樹的根節點?root?,返回其節點值的?后序遍歷?

示例 1:

?

7946c3dde8d9e906f146604880196ac6.jpeg

輸入:root = [1,null,2,3]
輸出:[3,2,1]

示例 2:

輸入:root = []
輸出:[]

示例 3:

輸入:root = [1]
輸出:[1]

提示:

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

(2). 思路

思路如下.

(3). 解

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> al = new ArrayList<>();if (root == null) {return al;}TreeNode cur = root;TreeNode pop = null;Deque<TreeNode> stack = new LinkedList<>();while (cur != null || !stack.isEmpty()){//只要cur不為null, 一直訪問左節點, 并不斷入棧if (cur != null) {stack.push(cur);cur = cur.left;} else {//此時棧頂元素的左孩子為null 即其左孩子無需處理TreeNode peek = stack.peek();//peek.right == null表明棧頂元素的右孩子無需處理//peek.right == pop表明棧頂元素的右孩子已經處理完畢if (peek.right == null || peek.right == pop){//訪問該棧頂元素, 并彈出al.add(peek.val);//記錄處理的節點pop = stack.pop();} else {//else表明該棧頂元素的右孩子待處理, 則cur = peek.rightcur = peek.right;}}}return al;}
}

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

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

相關文章

語音技能云云接入通用平臺

Cloud-to-Cloud(云云接入) 前言 項目地址&#xff1a;https://github.com/LeYunone/cloud-to-cloud 配置說明&#xff1a;https://leyunone.com/github-project/voice-cloud-cloud-config.html 注&#xff1a;學習測試以及使用請拉取 master 分支&#xff0c;release 是開發…

python pip 安裝

如果您不確定pip的安裝路徑&#xff0c;可以通過以下命令來查詢&#xff1a; pip show pip 這個命令會顯示pip的詳細信息&#xff0c;其中包括pip安裝的路徑。如果您想修改pip的默認安裝路徑&#xff0c;可以使用pip的"--target"參數指定目標路徑&#xff0c;例如&a…

8.7k Star!Khoj:你的AI第二大腦、開源RAG Cop??ilot、平替 MS Copilot與ChatGPT

原文鏈接&#xff1a;&#xff08;更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號&#xff01;&#xff09; 8.7k Star&#xff01;Khoj&#xff1a;你的AI第二大腦、開源RAG Cop??ilot、平替 MS Copilot與ChatGPT &#x1f31f;你的AI第二大腦。…

zynq-7015啟動分析及裸機BootLoader編寫(未完待續)

使用lwip-tcp遠程對QSPI進行更新、QSPI FLASH啟動 W25Q128資料&#xff1a; W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com) UG585資料&#xff1a; Zynq 7000 SoC Technical Reference Manual-UG585 翻譯…

【ARFoundation自學05】人臉追蹤(AR Face manager)實現

1. 修改攝像機朝向渲染方式-選中user 這個方式就會調用前置攝像頭 2 創建 AR Session、XR Origin&#xff0c;然后在XR Origin上面添加組件 注意&#xff1a;XR Origin 老版本仍然叫 AR Session Origin 接下來在XR Origin上面添加AR Face Manager組件&#xff0c;如下圖&am…

劇本殺市場仍在快速發展,劇本殺小程序成為了新的機遇

近年來&#xff0c;劇本殺一直是年輕人的娛樂游戲方式之一&#xff0c;劇本殺行業呈現出了井噴式發展的形勢&#xff0c;成為了當下爆火的娛樂方式。目前&#xff0c;劇本殺行業擁有了完善的劇本資源和呈現方式&#xff0c;發展前景非常大。 根據當下的數據顯示&#xff0c;劇…

NextJs 實現自定義點火操作

NextJs 實現自定義點火操作 前言實現自定義點火 前言 我希望在Nextjs 啟動的時候&#xff0c;能夠自定義實現一些項目的初始化邏輯&#xff0c;也可以說是一些點火操作&#xff0c;比如資源的加載&#xff0c;數據的初始化等操作。 實現自定義點火 我們可以在根目錄下創建一…

Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)

文章目錄 Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)1.開機動畫的啟動過程概述2.為什么設置了屬性之后就會播放&#xff1f; Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41) 1.開機動畫的啟動過程概述 下面就是BootAnimation的重要部…

移動app測試重要性體現在哪些方面?專業app測試報告獲取

移動app測試是指對手機應用進行各種測試和評估的過程&#xff0c;以確保應用的功能、性能和用戶體驗達到要求。在現代社會中&#xff0c;移動應用已經成為人們日常生活的一部分。無論是社交娛樂、購物支付還是工作學習&#xff0c;移動應用都發揮著不可替代的作用。因此&#x…

常微分方程 (ODE) 和 隨機微分方程 (SDE)

常微分方程&#xff08;Ordinary Differential Equations, ODE&#xff09;和隨機微分方程&#xff08;Stochastic Differential Equations, SDE&#xff09;是數學中描述系統動態行為的重要工具。它們有一些相似之處&#xff0c;但在處理隨機性方面存在顯著差異。 常微分方程…

Oracle數據庫面試題-5

81. 請解釋Oracle數據庫中的自動空間重新壓縮&#xff08;Automatic Space Recompression&#xff09;的概念。 Oracle 數據庫中的自動空間重新壓縮&#xff08;Automatic Space Recompression&#xff09; 自動空間重新壓縮是 Oracle 數據庫中的另一個重要特性&#xff0c;它…

Vue響應式系統分支切換與cleanup - 清除遺留的副作用函數

文章目錄 前言分支切換與cleanup分支切換的問題依賴集合的收集cleanup的實現完整的代碼展示 前言 本篇文章代碼思路來自 Vue3.0 源碼, 部分理解來源于霍春陽 《Vue.js設計與實現》這本書的理解, 感興趣的小伙伴可以自行購買閱讀。可以非常明確的感受到作者對 Vue 的深刻理解以及…

每天寫java到期末考試(6.6)-java文件輸入輸出流實驗

1、用字節流讀寫二進制文件 要求:用DataOutputStreamFileOutputStream類將1,2,…,100,這100個數字寫入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream類將d:\out1.bin的內讀出來,并輸出到屏幕上。 用DataOutputStreamFileOutputStream寫入二進制數據時,直接調…

單元測試AIR原則:提升代碼質量的秘密武器

文章目錄 引言一、AIR原則1. Automatic&#xff08;自動化&#xff09;2. Independent&#xff08;獨立性&#xff09;3. Repeatable&#xff08;可重復性&#xff09; 二、Automatic&#xff08;自動化&#xff09;三、Independent&#xff08;獨立性&#xff09;四、Repeatab…

【MySQL】sql語句之表操作(上)

序言 在上一篇的數據庫操作的內容中&#xff0c;學習了兩種屬性和常用的七種操作&#xff0c;學習是循序漸進的&#xff0c;庫的操作學完了&#xff0c;就要開始學習表的操作了&#xff0c;而表可與數據強相關&#xff0c;比如DDL&#xff0c;即數據定義語言&#xff0c;DML&am…

DVWA-XSS(Stored)

Low 觀察后端代碼&#xff0c;對輸入進行了一些過濾和轉義。trim(string,charlist) 函數用于移除字符串兩側的空白字符或其他預定義字符&#xff0c;charlist 參數可以規定從字符串中刪除哪些字符。stripslashes() 函數用于刪除反斜杠。mysqli_real_escape_string() 函數用于對…

SAAS系統架構設計剖析

多租戶數據隔離 用戶擔心數據安全性&#xff0c;也就是要做數據隔離&#xff0c;不允許 A 租戶查到 B 租戶的數據 1、軟隔離 數據在一起&#xff0c;只不過帶著租戶 id 查詢 在底層驅動 jar 上進行封裝&#xff0c;強制帶上租戶 id 比如&#xff1a;MySQL、MQ、Redis&#…

【論文精讀】DCRNN-擴散圖卷積循環神經網絡

DCRNN 模型是南加州大學的 Li 等人發表在 I C L R 2018 ICLR 2018 ICLR2018 會議上一個用于交通預測的時空預測模型,論文題目為: 《DIFFUSION CONVOLUTIONAL RECURRENT NEURAL NETWORK: DATA-DRIVEN TRAFFIC FORECASTING》,文章地址為: https://arxiv.org/abs/1707.01926。 …

vs中運行程序時,報不能運行解決方式

問題 在vs中編譯運行程序中&#xff0c;如果程序還在運行&#xff0c;編譯會報錯&#xff0c;但是在后臺又找不到對應的程序 解決方式 1、tasklist | find “進程名” 2、taskkill /PID

【實戰】kafka3.X kraft模式集群搭建

文章目錄 前言kafka2.0與3.x對比準備工作JDK安裝kafka安裝服務器增加hosts 修改Kraft協議配置文件格式化存儲目錄 啟動集群停止集群測試Kafka集群創建topic查看topic列表查看消息詳情生產消息消費消息查看消費者組查看消費者組列表 前言 相信很多同學都用過Kafka2.0吧&#xf…