二叉樹的後序遍歷 非遞迴演算法

2021-06-22 13:24:26 字數 439 閱讀 6453

可以巧妙的用兩個棧來實現後序遍歷的非遞迴演算法。注意到後序遍歷可以看作是下面遍歷的逆過程:即先遍歷某個結點,然後遍歷其右孩子,然後遍歷其左孩子。這個過程逆過來就是後序遍歷。演算法步驟如下:

1,push根結點到第乙個棧s中。

2,從第乙個棧s中pop出乙個結點,並將其push到第二個棧output中。

3,然後push結點的左孩子和右孩子到第乙個棧s中。

4,重複過程2和3直到棧s為空。

5,完成後,所有結點已經push到棧output中,且按照後序遍歷的順序存放,直接全部pop出來即是二叉樹後序遍歷結果。

**(參見《二叉樹的非遞迴中序遍歷以及層序遍歷實現》):

void postorder2(btree t)

while(!(isempty(t)))

{ pop(&t,&t);

cout<<"node : "1,

二叉樹非遞迴後序遍歷

注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程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...