資料結構 二叉樹後序遍歷(非遞迴)

2021-08-30 08:58:11 字數 617 閱讀 2710

後序遍歷:左-右-根

後序遍歷的順序是:左-右-根,和前、中序遍歷的不同之處在於,它在遍歷的時候,需要判斷它的右子樹是否已經被訪問過,如果已經訪問過的話,就直接取出當前節點,若沒有訪問過,則就去訪問。如果沒有這個操作,依舊和前、中序遍歷的思想一樣,就會在底部遞迴時,出現死迴圈。

①先將根節點入棧; 

②若根節點不存在左子樹和右子樹,或者根節點存在左子樹或右子樹,但左右子樹已經被輸出,則可以直接取出根節點,之後將其出棧,並將出棧節點標記為上乙個輸出的節點prev,再將此時的棧頂結點設為當前節點; 

③若不滿足②中的條件,則將根節點的左子樹和右子樹依次入棧,當前節點重新置為棧頂結點,之後重複操作②,直到棧為空時,遍歷結束。 

void binarytreepostordernonr(btnode* root)//後序遍歷的非遞迴

btnode* top = stacktop(&st);

//右樹訪問過了,才能訪問根節點

if (top->_right == null || top->_right == prev)//判斷右樹是否已經訪問過,如果不判斷就會出現死迴圈

else

}printf("\n");

}

資料結構 後序非遞迴遍歷二叉樹

檔名稱 postorder.c 檔案標識 後序非遞迴遍歷二叉樹 摘 要 用棧模擬後序遍歷二叉樹 當前版本 1.0 作 者 yu 完成日期 2004年8 月8日 取代版本 1.0 原作者 yu 完成日期 2004年8 月8日 include include define stack init size...

二叉樹非遞迴後序遍歷

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

後序非遞迴遍歷二叉樹

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