二叉樹後序遍歷(非遞迴)
這裡我們約定:空的節點用空格表示,按照前序遍歷來建立樹!//
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...