二叉樹後序遍歷 非遞迴

2021-08-23 12:03:12 字數 1366 閱讀 3429

二叉樹後序遍歷(非遞迴)

這裡我們約定:空的節點用空格表示,按照前序遍歷來建立樹!//

main.cpp

2#include 

<

iostream

>

3using

namespace

std;

4typedef 

struct

node binode,

*bitree;

9typedef 

struct

node1stack;

1314

void

createtree(bitree 

&t)   

//先序遞迴建立樹,這裡注意引數的型別,t的型別是 "*&" ,如果是 "**" **稍加改動就ok...

1525}26

void

initstack(stack 

*&st)

2731

bool

isempty(stack 

*st)

3235

bool

isfull(stack 

*st)

3639

void

push(stack 

*st,bitree t)

4045

bitree pop(stack 

*st)

4649

bitree gettop(stack 

*st)

5053

void

preordernore(bitree t)          

// 前序遍歷

5467if(

!isempty(st))

687273}

74}75void

inordernore(bitree t)      

//中序遍歷

7688if(

!isempty(st))

899495}

96}97void

postordernore(bitree t)        

//後序遍歷

98112

while(!

isempty(st)

&&tag[st

->

top]==1

)113

117if(!

isempty(st))

118123

else

break

;124

}125

}126

intmain()

127

執行結果如圖:

二叉樹後序遍歷(非遞迴)

二叉樹非遞迴後序遍歷

注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...

後序非遞迴遍歷二叉樹

後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...

二叉樹後序遍歷 遞迴和非遞迴

今天剛好想到這個問題,但是不太會,就查詢後記錄一下。首先是節點類 沒有進行一些屬性的封裝,見諒!class treenode public treenode list diguires newarraylist 遞迴進行後序遍歷 直接就先左,右,中順序遞迴呼叫即可 public list digui...