二叉樹深度優先搜索(非遞歸實現,迭代法)

目錄

為什么可以用迭代法實現二叉樹的前后中序遍歷?

前序遍歷

后序遍歷

中序遍歷


為什么可以用迭代法實現二叉樹的前后中序遍歷?

因為遞歸的實現本質是,每次遞歸調用都會把函數的局部變量、參數值和返回地址等壓入調用棧中,然后遞歸返回的時候,從棧頂彈出上一次遞歸的各項參數,這就是遞歸為什么可以返回上一層位置的原因。

所以我們可以用棧實現二叉樹的前中后序遍歷

前序遍歷

前序遍歷的順序是中左右,我們需要設置一個節點指針用來表示此時遍歷的節點,先將該節點指針初始化為根節點,然后判斷該節點指針是否為空指針,如果為空指針,則返回結果。如果不為空,那么先把根節點放入棧中,然后設置循環直到棧為空時循環結束。循環中將棧頂元素放入結果數組中,并彈出。然后先把該節點的右子節點放入棧中(如果該子節點不為空),把左子節點也放入棧中,然后進行下一次循環,這樣就可保證下次循環先處理的是左子節點。

具體代碼:

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;if(root == nullptr) return result;st.push(root);while(!st.empty()) {TreeNode* node = st.top();result.push_back(node->val);st.pop();if(node->right) st.push(node->right);if(node->left) st.push(node->left);}return result;}
};

后序遍歷

后序遍歷的順序是左右中。由于前序遍歷的順序是中左右,我們如果交換左右子節點入棧順序,就可以實現左右子節點的遍歷順序的交換。所以將前序遍歷的左右子節點壓棧語句交換位置,可以實現中右左遍歷順序,然后對最后的結果數組進行翻轉就可以實現左右中遍歷順序,即后序遍歷。

具體代碼:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> result;if(root == nullptr) return result;st.push(root);while(!st.empty()) {TreeNode* node = st.top();result.push_back(node->val);st.pop();if(node->left) st.push(node->left);if(node->right) st.push(node->right);}reverse(result.begin(), result.end());return result;}
};

中序遍歷

在前序遍歷中主要有兩個操作:

處理:將元素放進result數組中

訪問:遍歷節點

前序遍歷的順序是中左右,先訪問的是中間節點,要處理的元素也是中間節點,即要訪問的元素和要處理的元素順序是一致的

中序遍歷的順序是左中右,先訪問的是二叉樹頂部的節點,然后一層層向下訪問,直到到達樹左邊的最底部,然后才開始把節點數值放進結果數組中,即處理順序和訪問順序不一致

具體實現過程是:先設置循環直到棧為空結束循環,此時節點遍歷完畢,返回結果數組。如果棧不為空,或者節點不為空則進入循環體內部,循環體內部需要先判斷節點是否為空。如果不為空,就把該節點放入棧中,然后遍歷下一個左節點(左)。如果節點為空,則將棧頂節點值放入結果數組中(中),然后彈出棧頂元素,同時遍歷該節點的右子節點(右)。

具體代碼:

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;TreeNode* cur = root;while(!st.empty() || cur!=nullptr) {if(cur != nullptr) {st.push(cur);cur = cur->left;}else {TreeNode* node = st.top();st.pop();result.push_back(node->val);cur = node->right;}}return result;}
};

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

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

相關文章

web期末作業設計網頁

設計一個網頁作為期末作業是一個很好的機會來展示你的前端開發技能。以下是一些步驟和建議&#xff0c;幫助你完成這個項目&#xff1a; 1. 確定網頁主題和目的 決定你的網頁是關于什么的&#xff08;例如&#xff1a;個人博客、在線商店、公司網站、信息發布平臺等&#xff…

國產車規MCU OTA方案總結

目錄 1. 旗芯微FC4150 OTA 2. 云途YTM32B1MD OTA 3.小結 今天沒有廢話&#xff0c;啪一下很快&#xff0c;把目前接觸到的國內帶eFlash的車規MCU硬件OTA方案做一個梳理。 1. 旗芯微FC4150 OTA 旗芯微FC4150是基于ARM Cortex(快去審核下官網介紹&#xff0c;少了個T)-M4F內…

入門者必看-Ansible:自動化運維的利器

1. 引言 在當今快速變化的IT環境中&#xff0c;自動化成為了提升工作效率和確保系統一致性的重要手段。Ansible作為一個開源的自動化工具&#xff0c;因其簡單易用、功能強大而廣受歡迎。本文將深入探討Ansible的概念、架構、體系結構、搭建過程、常用操作方式以及使用場景&…

openGauss Developer Day 2024丨MogDB實現數據庫技術跨越,Ustore引擎革新存儲新境界

openGauss Developer Day 2024 6月21日&#xff0c;openGauss Developer Day 2024在北京昆泰嘉瑞文化中心成功召開。大會聚集學術專家、行業用戶、合作伙伴和開發者&#xff0c;共同探討數據庫面向多場景的技術創新&#xff0c;分享基于 openGauss 的行業聯合創新成果及實踐案例…

探索PHP中的魔術常量

PHP中的魔術常量&#xff08;Magic Constants&#xff09;是一些特殊的預定義常量&#xff0c;它們在不同的上下文中具有不同的值。這些常量可以幫助開發者獲取文件路徑、行號、函數名等信息&#xff0c;從而方便調試和日志記錄。本文將詳細介紹PHP中的魔術常量&#xff0c;幫助…

web前端——javaScript

目錄 一、javaScript概述 1.javaScript歷史 2.JavaScript與html,css關系 二、基本語法 ①放在head中 ②放在 body中 ③寫在外部的.js文件中 1.變量 2.數據類型 3.算術運算符 4.邏輯運算符 5.賦值運算 6.邏輯運算符 7.條件運算符 8.控制語句 三、函數 1…

智能掃地機器人環境感知與地圖構建優化方案

以下是一個針對智能掃地機器人程序中環境感知與地圖構建問題的具體解決方案&#xff0c;參考了之前文章中的相關技術和信息&#xff1a; 智能掃地機器人環境感知與地圖構建優化方案 一、引入高精度傳感器 激光雷達&#xff08;LiDAR&#xff09;&#xff1a;使用高精度激光雷達…

模板語法輪播

1.常用的視圖容器組件 view類似于div進行使用 <div></div><view></view> scroll-view實現滾動列表效果 <scroll-view scroll-y> <view></view> <view></view> <view></view> </scroll-view> …

數據庫死鎖解決

一、Oracle死鎖查看和解決辦法匯總 由于生產的tomcat 經常有假死問題&#xff0c;困擾很久&#xff0c;最后發現有死鎖&#xff0c;解決辦法分享 1.1、查看死鎖 1.1.1、用dba用戶執行以下語句 select username,lockwait,status,machine,program from v$session where sid in …

Arduino - 按鈕 - 長按短按

Arduino - Button - Long Press Short Press Arduino - 按鈕 - 長按短按 Arduino - Button - Long Press Short Press We will learn: 我們將學習&#xff1a; How to detect the button’s short press 如何檢測按鈕的短按How to detect the button’s long press 如何檢測…

重大進展!微信支付收款碼全場景接入銀聯網絡

據中國銀聯6月19日消息&#xff0c;近日&#xff0c;銀聯網絡迎來微信支付收款碼場景的全面接入&#xff0c;推動條碼支付互聯互通取得新進展&#xff0c;為境內外廣大消費者提供更多支付選擇、更好支付體驗。 2024年6月&#xff0c;伴隨微信支付經營收款碼的開放&#xff0c;微…

Docker部署Nginx+Keepalived

# 創建掛載路徑 mkdir /data/nginx_keep/nginx/conf -p mkdir /data/nginx_keep/keepalived/vim nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {incl…

Rust: duckdb和polars讀csv文件比較

一、文件準備 樣本內容&#xff0c;N行9列的csv標準格式&#xff0c;有字符串&#xff0c;有浮點數&#xff0c;有整型。 有兩個csv文件&#xff0c;一個大約是2.1萬行&#xff1b;一個是64萬行。 二、toml文件 [package] name "my_duckdb" version "0.1.0&…

opencv簡單小項目

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;它提供了大量的圖像和視頻處理功能。使用OpenCV可以開發各種簡單的小項目&#xff0c;例如&#xff1a; 圖像基本操作&#xff1a; 讀取和顯示圖像。調整…

弱監督學習

弱監督學習&#xff08;Weak Supervision&#xff09;是一種利用不完全、不精確或噪聲數據進行模型訓練的方法。以下是一些常用的弱監督方法及其原理&#xff1a; 1. 數據增強&#xff08;Data Augmentation&#xff09; 原理&#xff1a; 數據增強是一種通過增加訓練數據的多…

區塊鏈的歷史和發展:從比特幣到以太坊

想象一下&#xff0c;你住在一個小鎮上&#xff0c;每個人都有一個大賬本&#xff0c;記錄著所有的交易。這個賬本很神奇&#xff0c;每當有人買賣東西&#xff0c;大家都會在自己的賬本上記一筆&#xff0c;確保每個人的賬本都是一致的。這就是區塊鏈的基本思想。而區塊鏈的故…

HG/T 5838-2021金屬骨架發泡橡膠復合密封板檢測

金屬骨架發泡橡膠復合密封板是指工作溫度范圍-40&#xff5e;140℃&#xff0c;峰值溫度為150℃條件下使用的金屬骨架發泡密封板。 HG/T 5838-2021金屬骨架發泡橡膠復合密封板檢測項目&#xff1a; 測試項目 測試標準 外觀 HG/T 5838 厚度 HG/T 5838 壓縮性能 GB/T 206…

VSCode安裝OpenImageDebugger

VSCode安裝OpenImageDebugger 1. 官網2. 編譯2.1 依賴項2.2 編譯 OpenImageDebugger2.3 配置 GDB 和 LLDB 3. 驗證安裝是否成功 1. 官網 下載路徑&#xff1a;OpenImageDebugger 2. 編譯 2.1 依賴項 官網上描述&#xff0c; Qt 5.15.1Python 3.10.12 這兩個其實配置并不需…

【好物推薦】給大家安利一個liux運維全能腳本工具箱

前幾天在開源社區沖浪的時候無意間逛到一個部署帖&#xff0c;里面提到了一個腳本&#xff0c;讓我眼前一亮。 科技Lion的Shell腳本&#xff01;大家趕緊去體驗學習一下&#xff0c;感覺寫的還是不錯的。 該工具是一款全能腳本工具箱&#xff0c;使用shell腳本編寫。專為Linux服…

Jenkins多stage共享同一變量方式

在第一個stage中為這個變量賦值&#xff0c;在其它stage中使用這個變量 import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.nio.file.StandardCopyOption import groovy.json.JsonOutput import groovy.json.JsonSlurper// 共享的…