詳解二叉樹後序遍歷非遞迴實現!思路超清晰

2021-09-25 16:59:02 字數 961 閱讀 2191

今天覆習了二叉搜尋樹的建立,二叉樹的前、中、後序遍歷遞迴與非遞迴的實現,按層遍歷等等。其中較難的是二叉樹的後序遍歷過程

因此單獨拿出來詳細分析一下過程,以及在這個過程中我踩得一些坑

/**

* 後序非遞迴遍歷

* @param root

*//**

* 思路:首先要搞清楚什麼時候才能輸出根節點的值,必須等到左節點和右節點都訪問完的情況才能訪問根節點

* 因此,訪問根節點的情況有兩種:

* 一、當前節點的左右子樹都為null時,可以直接訪問根節點

* 二、當前節點的左右子樹都訪問過時,則可以直接訪問根節點

* 則可以設定乙個標誌,讓他標識上乙個訪問的結點

* 遍歷棧時,得到棧頂元素,判斷他的左右子樹為空或者pre標誌是否等於當前結點的左右孩子的其中乙個時,

* 當這兩種情況滿足其中一種,則就可以訪問當前根節點。

* * 至於為什麼要判斷pre標誌是否等於當前結點的左右孩子的其中乙個,而不是判斷它是否等於當前結點的右孩子?

* 原因是這樣的:因為可能存在這樣一種情況,當前結點只有左孩子結點,則如果去判斷它是否等於當前結點的右孩子結點

* 得到的一定是false,這樣當前結點永遠都不會被訪問,並且會陷入死迴圈,左孩子一直迴圈入棧的情況。當根結點左

* 子樹訪問完,如果存在右子樹,則會從棧頂得到右子樹結點,而此時pre標誌等於根節點的左子女,因此第二個條件不成立(

* 即pre不會等於根節點右子女的任何乙個子女結點)

* * linkedlist有乙個坑:push操作實際掉的addfirst方法,而pop方法實際掉的是removefirst方法,煉表頭是棧頂!!並不是鍊錶尾

*/public static void endprinttreeno(treenode root) else

} }

二叉樹非遞迴後序遍歷

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