給出一棵二叉樹,返回其節點值的後序遍歷。
解答:了解下後序遍歷,在二叉樹中,先左後右再根,即首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。
那麼非遞迴的思想下,我們可以考慮採用深度優先遍歷訪問節點的演算法來輸出後序遍歷。由此我們需要借助棧。
同時,我們需要考慮到如何確認節點是否被訪問過,因此我們借助set容器儲存已經被訪問過的節點。容器內的節點表示該節點被訪問過。
**:
/**
* definition of treenode:
* class treenode
* }*/class
solution
tmp.
push
(root)
;while
(tmp.
size()
)// 當右孩子未訪問過,則將右孩子壓入棧
if(top-
>right &&
!setused.
count
(top-
>right)
)// 左右孩子為空,為當前樹的根,壓入到後續遍歷容器中
vec.
push_back
(top-
>val)
;// 記錄已經被訪問過
setused.
insert
(top)
;// 出棧
tmp.
pop();
}return vec;}}
;
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程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...