二叉樹的後序遍歷演算法比先序和中序的遍歷演算法要複雜一些。其出棧條件有兩種情況:
棧頂元素所指向的節點的左子樹和右子樹均為空;
棧頂元素所指向的節點的左子樹和右子樹均被訪問過。
第二種情況,加乙個指標pre,來紀錄此節點是否被訪問過了,進棧順序是先進右子樹,再進左子樹
void
postordernor
(btnode* root)
else
}stackdestroy
(&s)
;}
前序遍歷為:根–左--右,後序遍歷為:左–右--根, 後序遍歷翻轉一下就是:根–右--左,
我們可以將二叉樹前序非遞迴遍歷改一下,可以先進左子樹,再進右子樹,這樣最後得出的結果就為:根–右--左,再將它逆向輸出即為後序遍歷;
void
postordernor
(btnode* root)
while(!
stackempty
(&s1)
)stackdestroy
(&s)
;stackdestroy
(&s1)
;}
void
postordernor
(btnode* root)
btnode* ptop =
gettopstack
(&s);if
(ptop-
>_right ==
null
||ptop-
>_right==pprev)
else
pcur = ptop-
>_right;
}destroystack
(&s)
;}
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...
後序非遞迴遍歷二叉樹
後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...
二叉樹後序遍歷 非遞迴
二叉樹後序遍歷 非遞迴 這裡我們約定 空的節點用空格表示,按照前序遍歷來建立樹!main.cpp 2 include iostream 3using namespace std 4typedef struct node binode,bitree 9typedef struct node1stack...