首先從簡單的例子開始
上圖二叉樹的後序遍歷序列是"231", 顛倒一下就是"132", 而其前序遍歷是"123"
有什麼發現?
後序遍歷的倒序和前序的區別只是2和3的交換, 反映在演算法中就是先左後右和先右後左的差別.
也就是說後序遍歷的倒序就是按先右後左順序的前序遍歷.
所以我們只需要按先右後左順序去前序遍歷二叉樹, 再將其結果顛倒就是正常後序遍歷演算法的結果.
而如果使用棧的話, 先入後出也就相當於顛倒了順序.
根據上述思路就可以寫出以下的非遞迴後序遍歷演算法
public
void
nonrecursivepostorder
(node root)
else
}//彈出並訪問所有元素完成遍歷.
while
(!reverse.
isempty()
)}
與遞迴後序遍歷對比一下是否正確
public
static
void
main
(string[
] args)
;for
(int i : wait)
//這裡使用arraylist方便列印檢視結果
arraylist post =
newarraylist()
; arraylist nonrecursivepre =
newarraylist()
; binary.
postorder
(post)
; binary.
nonrecursivepostorder
(nonrecursivepre)
; system.out.
println
("遞迴後序遍歷:"
+post)
; system.out.
println
("非遞迴後序遍歷:"
+nonrecursivepre)
;}
測試結果 二叉樹的後序遍歷 非遞迴演算法
可以巧妙的用兩個棧來實現後序遍歷的非遞迴演算法。注意到後序遍歷可以看作是下面遍歷的逆過程 即先遍歷某個結點,然後遍歷其右孩子,然後遍歷其左孩子。這個過程逆過來就是後序遍歷。演算法步驟如下 1,push根結點到第乙個棧s中。2,從第乙個棧s中pop出乙個結點,並將其push到第二個棧output中。3...
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...
後序非遞迴遍歷二叉樹
後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...