![二叉樹后序遍歷的非遞歸算法_第1頁](http://file4.renrendoc.com/view/b2134409bf214122f250abbfff245324/b2134409bf214122f250abbfff2453241.gif)
![二叉樹后序遍歷的非遞歸算法_第2頁](http://file4.renrendoc.com/view/b2134409bf214122f250abbfff245324/b2134409bf214122f250abbfff2453242.gif)
![二叉樹后序遍歷的非遞歸算法_第3頁](http://file4.renrendoc.com/view/b2134409bf214122f250abbfff245324/b2134409bf214122f250abbfff2453243.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
二叉樹后序遍歷的非遞歸算法。很久以前,我曾經(jīng)問過一位老師,“二叉樹后序遍歷的非遞歸算法怎么實(shí)現(xiàn)???”老師說,“你可以使用棧來實(shí)現(xiàn)?!庇谑?,我就開始了解和學(xué)習(xí)關(guān)于二叉樹后序遍歷的非遞歸算法了。
二叉樹后序遍歷,顧名思義,就是先遍歷二叉樹的左子樹,然后遍歷右子樹,最后才訪問根節(jié)點(diǎn)。由于這種遍歷方式需要先遍歷完左右子樹,才能遍歷根節(jié)點(diǎn),所以我們需要使用一個(gè)棧來記錄節(jié)點(diǎn),好讓我們回到之前遍歷時(shí)還未遍歷完的節(jié)點(diǎn)進(jìn)行處理。因此,我們需要一個(gè)參數(shù)來標(biāo)識當(dāng)前是否為第一次訪問該節(jié)點(diǎn),以及棧來存儲中間節(jié)點(diǎn)。
具體做法如下:
1.對于任意節(jié)點(diǎn),如果左節(jié)點(diǎn)不為空,則將該節(jié)點(diǎn)壓入棧,并將左節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),重復(fù)步驟1。
2.當(dāng)左子樹為空時(shí),先判斷右子樹是否也為空,如果右子樹不為空,則將這個(gè)節(jié)點(diǎn)的標(biāo)記改為已訪問,并將當(dāng)前節(jié)點(diǎn)設(shè)置為右子節(jié)點(diǎn),重復(fù)步驟1。
3.如果左右子樹均為空或已被訪問過,則訪問該節(jié)點(diǎn)并出棧,將當(dāng)前節(jié)點(diǎn)設(shè)置為NULL。
4.重復(fù)步驟1到3,直到棧為空。
這就是二叉樹后序遍歷的非遞歸算法。下面是詳細(xì)代碼:
```
voidpostOrderTraversal(TreeNode*root){
stack<TreeNode*>nodeStack;
TreeNode*current=root;
TreeNode*lastVisited=nullptr;
while(!nodeStack.empty()||current!=nullptr){
if(current!=nullptr){
nodeStack.push(current);
current=current->left;
}else{
TreeNode*peekNode=nodeStack.top();
if(peekNode->right!=nullptr&&lastVisited!=peekNode->right){
current=peekNode->right;
}else{
cout<<peekNode->val<<"";
lastVisited=peekNode;
nodeStack.pop();
}
}
}
}
```
首先,我們先創(chuàng)建一個(gè)空的棧和一個(gè)指向根節(jié)點(diǎn)的指針current。在遍歷過程中,我們需要記錄上一次被訪問的節(jié)點(diǎn),初始值為nullptr。
我們將current不斷的壓入棧中,并將current設(shè)置為它的左孩子節(jié)點(diǎn),直到current走到二叉樹最左邊的節(jié)點(diǎn)。當(dāng)current為空時(shí),我們從棧中取出棧頂元素,判斷它是否有右子樹,并且上一個(gè)被訪問的節(jié)點(diǎn)不是其右子樹。如果上一個(gè)被訪問的節(jié)點(diǎn)不是其右子樹,說明右子樹尚未被遍歷。因此,我們應(yīng)該將current指向其右孩子節(jié)點(diǎn),以此來完成對右子樹的遍歷。否則,說明右子樹已經(jīng)遍歷完成,我們訪問當(dāng)前棧頂元素并將其出棧。然后,我們將lastVisited設(shè)置為棧頂元素,以標(biāo)記它已經(jīng)被訪問過。最后,將current設(shè)置為nullptr,讓之后從棧中取出的節(jié)點(diǎn)不再對其進(jìn)行左子樹遍歷。
在這個(gè)非遞歸算法中,我們使用了lastVisited來判斷右子樹是否已經(jīng)被遍歷。這樣能夠省去另外一個(gè)棧。如果不使用lastVisited變量
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國跳舞燈行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國鐵餅推車數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國聚酯瓶吹瓶機(jī)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國精密零部件自動(dòng)檢測與分選設(shè)備數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國水管道式空調(diào)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國橡膠大紅LC數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國對-硝基苯甲酰氯數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國人工繡花背心數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年中國貫流風(fēng)幕市場調(diào)查研究報(bào)告
- 2025年中國耐火纖維管市場調(diào)查研究報(bào)告
- 二零二五年度大型自動(dòng)化設(shè)備買賣合同模板2篇
- 江西省部分學(xué)校2024-2025學(xué)年高三上學(xué)期1月期末英語試題(含解析無聽力音頻有聽力原文)
- GA/T 2145-2024法庭科學(xué)涉火案件物證檢驗(yàn)實(shí)驗(yàn)室建設(shè)技術(shù)規(guī)范
- 2025內(nèi)蒙古匯能煤化工限公司招聘300人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年中國融通資產(chǎn)管理集團(tuán)限公司春季招聘(511人)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 寵物護(hù)理行業(yè)客戶回訪制度構(gòu)建
- 電廠檢修管理
- 《SPIN銷售法課件》課件
- 機(jī)動(dòng)車屬性鑒定申請書
- 2024年中考語文試題分類匯編:非連續(xù)性文本閱讀(學(xué)生版)
- 2023年廣州金融控股集團(tuán)有限公司招聘筆試題庫及答案解析
評論
0/150
提交評論