中根非遞迴遍歷二叉樹

2021-07-09 13:13:19 字數 1229 閱讀 6702

在先根非遞迴中,根入棧後彈出,訪問,右孩子與左孩子進棧,順序很清楚。但是中根非遞迴與後根非遞迴中,根入棧後如果彈出不能訪問,這是乙個困惑的地方。

為了更明晰地,更統一3種非遞迴設計思路。均可以採用入棧,彈出,左右子樹入棧這種基本步驟。每個步驟需要仔細在紙上演示設計。

由於乙個節點出棧後還要進棧,該節點再次位於棧頂時,由於出過棧,再次出棧的時候就直接訪問,而不要重複檢查他的左右子樹了。所以,每個節點還有乙個標誌位:ispulled.如果為true,則說明該節點出過棧。

經過一些例子演示。設計一種中根非遞迴的解決步驟:

根r入棧s

while(s不空)

棧頂head

if(head.ispulled == true)//head是出過棧

head出棧,訪問head

else//head沒有出過棧

head出棧,head.ispulled=ture

//因為中根,根在中間,那麼就再次將右子樹,根,左子樹的順序入棧。這樣在彈出的時候就是左根右的順序

//首先判斷head左右子樹是否全null,如果全null,那麼訪問head

if(head.left==null && head.right==null)

訪問head

if(head.right!=null)//右孩子不空進棧

s.enstack(head.right)

if(head.left!=null || head.right!=null)//有孩子,則就重進棧

s.enstack(head)

if(head.left!=null)//左孩子不空進棧

s.enstack(head.left)

以上步驟的設計,完全是逐步求精、逐步完善的,先主後次,得到的結果。從手工圖紙的步驟中得到一般的規律,主要規律,並用**表示。

**最後的結果順序,體現了一種從上到下,精準的邏輯。但是這種準確的邏輯,依靠人腦是不可能從一開始嚴絲合縫的寫下了。這樣,最初的設計就體現的非常關鍵了。

**中的條件判斷,屬於次要步驟,在設計好主要步驟後,後加進去進行完善。

例子中,一顆如下所示的二叉樹,進行中根非遞迴遍歷的思路:

二叉樹的非遞迴遍歷 先根遍歷 中根遍歷 後根遍歷

本文 include include include include include include include using namespace std typedef int elemtype define nullptr null typedef struct treenode treeno...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...