方法一:
我們可以發現二叉樹的後序遍歷=映象二叉樹的先序遍歷的反向輸出。於是需要:
1.得到映象二叉樹
2.非遞迴的先序遍歷映象二叉樹
3.將節點的訪問結果儲存在棧中,利用先入後出的特點將輸出結果的順序反向
class
tree};
class
solution
t = s.
top();
s.pop();
t = t-
>right;
}while
(!sout.
empty()
)return ans;}}
;
void
postordernonrecur2
(treenode* root)
t = s.
top();
if(t-
>right ==
nullptr
|| t-
>right == tempright)
//如果右子樹不存在或者右子樹已被訪問
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...