二叉樹的前序,中序,後序遍歷 遞迴和非遞迴實現

2022-05-05 07:48:07 字數 1478 閱讀 7333

前序遍歷:按照「根-左-右」的順序遍歷。

中序遍歷:按照「左-根-右」的順序遍歷。

後序遍歷:按照「左-右-根」的順序遍歷。

遞迴版:

遞迴版的**非常簡單,我給大家分析一下原理。

①我們先忽略中間的列印語句,單獨分析這個函式

②遍歷順序是不是這樣的。

1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->7->null->7->null->7->3->1

③我們把null去掉。

1->2->4->4->4->2->5->5->5->2->1->3->6->6->6->3->7->7->7->3->1

④裡面的每乙個數都出現了3次。

⑤若我們將這些數第一次出現就列印。就是先序遍歷。

1->2->4->5->3->6->7

⑥若我們將這些數第二次出現就列印。就是中序遍歷

4->2->5->1->6->3->7

⑦若我們將這些數第三次出現就列印。就是後序遍歷

4->5->2->6->7->3->1

中序遍歷**:

後序遍歷**:

非遞迴版:

先序遍歷。

①先準備乙個棧

②先將根節點壓入棧

③彈出乙個節點。列印節點。

④若右孩子不為null,就將右孩子壓棧。

⑤若左孩子不為null,就將左孩子壓棧。

⑥重複3,4,5步直到棧為空。

**實現

中序遍歷

①先準備乙個棧

②若當前節點不為空,將當前節點壓棧,然後來到左孩子

③若當前節點為空,彈出乙個節點並列印。然後來到右孩子。

④當前節點非空或棧不為空執行2,3。

**實現

後序遍歷

後序遍歷如果只用乙個棧來實現有點麻煩。遞迴版可以做到將乙個節點壓入棧中3次。自己壓棧則有些麻煩。我們採用使用兩個棧的方式來實現後序遍歷。

在實現前序遍歷的非遞迴實現時,①壓根節點,②壓右節點,③壓左節點(根->左->右)

這樣我們可以①壓根節點,②壓左節點,③壓右節點將它放入乙個棧中(根->右->左)

然後將上面的棧倒進另乙個棧中。就變成了(左->右->根)。為後序遍歷順序。

2.**實現:

全部**:

執行結果:

**自

二叉樹遍歷(前序,中序,後序

二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...

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

首先我們來講前序遍歷。前序遍歷很簡單,首先判斷根樹是否為空 注意前序遍歷的次序是 根 左子樹 右子樹 如此遞迴呼叫。以下為 templatevoid bitree preorder binode bt 中序遍歷是實際問題中經常使用的一種遍歷。其 形式與前序遍歷很相似,其遍歷順序為 左子樹 根 右子樹...

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

做個筆記,方便日後查閱 全部是模板函式,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...