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

2021-10-12 19:36:59 字數 1621 閱讀 3422

如需遞迴寫法,可以參考:

結構體定義:

struct node

;//構建二叉樹使用二叉鍊錶

使用非遞迴的寫法,必然需要其他輔助空間來實現,對於遞迴改寫成非遞迴的乙個做法而言,我們首選的輔助空間就是結構。

而我們要做的,就是使用棧去模擬遞迴的操作(只能操作棧頂)。

如果想使用棧完全模擬遞迴的操作,將會對結構體進行更改,這是不允許的。

那麼……在不更改結構體定義的前提下,如何實現非遞迴寫法呢?

(以下使用了c++ stl中的stack)

思路:

棧空即為樹遍歷完成。

**:

void

preorder

(node* root)

} cout << endl;

}

思路:

由於不能提前將根節點入棧(提前入棧會使得程式判定左子樹入棧變得更加困難),因此需要給迴圈乙個除了棧空以外的入口,故結束條件不能簡單的判定棧是否為空,應當為p為null且棧為空

**:

void

inorder

(node* root)

p = s.

top();

//去處棧頂元素

s.pop();

//每個元素只訪問一次,將棧頂元素出棧

cout << p-

>data;

//做訪問

p = p-

>rchild;

//令p為其節點的右子樹,如果右子樹存在,即為其右子樹,不存在為null

/* 當然也可以寫成如下形式,更便於理解:

if (p->rchild!=null)

else

*/} cout << endl;

}

思路:

結束條件同中序遍歷

**:

void

postorder

(node* root)

/* 為了解決僅有右子樹而沒有左子樹的情況 */

else

if(p-

>rchild !=

null

)else

/* 這裡else if和else這兩行,可以合併成:

else

合併後**簡潔並且效率有略微提公升,不合併便於理解,可以自行取捨;

*/}

p = s.

top();

//取棧頂元素

s.pop();

//每個元素僅訪問一次,出棧

cout << p-

>data;

//訪問if(

!s.empty()

&& p == s.

top()-

>lchild)

else}

cout << endl;

}

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

做個筆記,方便日後查閱 全部是模板函式,c 語言 template void preorder node root,ostream os if st.empty os endl template void midorder node root,ostream os if st.empty os en...

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

今天弄了一天的二叉樹的前序 中序和後序遍歷,分享出來,共同交流。中採用先序遍歷的方法建立二叉樹,示例建立二叉樹格式如下 建立過程中,以 include include typedef struct btnodebtnode,btree typedef struct stackbtstack type...

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

前言 二叉樹的非遞迴遍歷需要用到棧的一些操作,所以貼出棧的相關操作的鏈結 定義資料結構 typedef char btdatatype typedef struct binarytreenode btnode 1.前序遍歷 遞迴 按照前序遍歷的規則,先訪問根節點,在遞迴遍歷左子樹,最後遞迴遍歷右字樹...