非遞迴前,中,後序遍歷二叉樹

2021-08-10 01:38:21 字數 1749 閱讀 4169

相比遞迴遍歷二叉樹,非遞迴遍歷二叉樹稍難一些,而又數非遞迴後序遍歷二叉樹更難。在我通過與這段時間所學資料結構相結合,學習和了解了非遞迴遍歷二叉樹的方法,

這裡三種遍歷方式都會用到棧,利用棧的逐層壓棧與先進後出的特點,類似於用**實現了遞迴遍歷二叉樹的基本方法。非遞迴二叉樹的遍歷個人認為注重的是思想,**實現思想,呈現思維過程,所以在這裡,我先是用畫圖的方式模擬非遞迴遍歷二叉樹時的步驟以及棧中的元素變化,最後通過**將這個過程來實現的.

(1)前序遍歷順序是根節點-----左節點-----右節點,我們首先從根節點root開始邊壓棧邊列印,從他們的每個左節點逐層向下壓棧,一直壓到最左葉子結點的左孩子

(2)取棧頂結點,依次訪問他們的右結點,下面的右節點訪問完表示下面的子樹都訪問完,然後pop出棧,再去棧頂結點,繼續訪問它的右節點,一直到訪問根節點的右樹,根節點的右樹訪問完之後,pop出棧,此時棧中節點為空了,表示整個二叉樹已經遍歷完。

下面是給的兩種**的實現,思想相同.

前序遍歷

//第一種實現**

void prevordernonr(node* root)

//cur為null表示遍歷到最左節點的左孩子

//開始逐層向上訪問他們的右節點

node* top = tmp.top();

tmp.poo();

cur = top->_right;

}}

另一種方法是右節點和左節點一起遍歷,不一樣的是左節點不用壓棧,直接列印,每次壓入其根節點的右孩子,到最後葉子節點後,去棧頂,並出棧,依次向上列印右樹

不過思想還是相同,**如下:

void prevordernonr(node* root)

//到最左葉子結點,開始列印和遍歷右節點

cur = tmp.top();

cout<_right;

} }

相比較前兩種的遍歷方法,這裡的後序會比較難,但也不是很難,有乙個小坑,在思考和**實現中要多加考慮。

後序遍歷順序是左節點------右節點------根節點

根據前面兩種的類似方法,我們裡所以當是先從根節點開始,逐層向下,壓入他們的最左節點,然後逐層向上依次訪問他們的右節點,最後再是列印他們的根節點。

先下,然後上右,然後上右,一直到根節點也如此,最後棧內節點為空,遍歷結束。

在這裡,我們需要再遍歷完他們的右節點後在返回到根節點時,需要再設定乙個prev變數,來儲存他們的前一訪問節點,以便能找到回家的路^ ^

坑來了,從右節點返回到根節點這裡需要再判斷一次,前一位置是否訪問的是他的右孩子,如果是右孩子,則向上出棧,如果不是則訪問右節點,如果沒有判斷,那麼

將會在這裡死迴圈一直在根節點和右節點之間無限迴圈。

後序遍歷需要注意的就這麼多了,**呈上,如下:

void _postorder_nonr(node* root)

//逐層向上訪問右節點和根節點

while(!tmp.empty())

}cout《這就是非遞迴前,中,後序遍歷二叉樹的基本思想和**實現,希望對你有所幫助  ps:資料結構注重的是思維,其次是**的實現,**實現也是思維的呈現.

二叉樹的前中後序遍歷(遞迴 非遞迴)

二叉樹節點類 author wj class treenode 二叉樹類 author wj class binarytree private void add node to tree int value 建立二叉樹 treenode currentnode treenode while true...

二叉樹的前中後序非遞迴遍歷

前序遍歷最簡單,無腦入棧無腦出棧,出棧的時候先入右再入左即可。class solution stack.push root while stack.size 0 if temp.left null return res 中序遍歷比較特殊,要有乙個前驅指標p來一直向左試探,所以條件上多了一項p nul...

二叉樹的前 中 後序遍歷(遞迴與非遞迴)

常見的二叉樹的遍歷有三種方式 前序遍歷 根節點,左子樹,右子樹 中序遍歷 左子樹,根節點,右子樹 後序遍歷 左子樹,右子樹,根節點 每種方式都可以用遞迴和非遞迴來實現 一 遞迴遍歷 1.先序遍歷 先訪問根節點,再訪問左子樹,左子樹訪問完之後,訪問右子樹 void btreeprevorder btn...