前序遍歷:按照「根-左-右」的順序遍歷。
中序遍歷:按照「左-根-右」的順序遍歷。
後序遍歷:按照「左-右-根」的順序遍歷。
遞迴版:
遞迴版的**非常簡單,我給大家分析一下原理。
①我們先忽略中間的列印語句,單獨分析這個函式
②遍歷順序是不是這樣的。
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...