今天剛好想到這個問題,但是不太會,就查詢後記錄一下。
首先是節點類:
沒有進行一些屬性的封裝,見諒!
class
treenode
public
treenode()
}
list
diguires =
newarraylist
<
>()
;//遞迴進行後序遍歷:直接就先左,右,中順序遞迴呼叫即可
public list
digui
(treenode root)
後序遍歷的非遞迴方法:
list
notdiguires =
newarraylist
<
>()
;//因為要使用非遞迴的方法來進行遍歷,後序遍歷正常是左右中:
//這裡就是利用棧來儲存,用中右左的順序來存放節點,哪齣棧順序就是正常的後序順序
public list
notdigui
(treenode root)
else
}while
(output.
size()
>0)
return notdiguires;
}
註解寫的已經差不多了,這裡總結一下:
就是當前節點有值就放入到棧中/中/,然後看右子節點是否有值/右/,如果有就放入棧中,沒有就說明已經到葉子節點了,然後就取出棧裡面的頂節點(也就是上乙個放入的節點),操作左子節點/左/,繼續上面的步驟,直到最左邊的子節點為空(也就是最左邊的葉子節點)。
也就是按照後序相反的順序存放於棧中,從棧裡面取出的就是正常的後序遍歷
具體還無法理解可以畫個樹來按照步驟操作一下!
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程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...