前言
二叉樹的遍歷是指不重複地訪問二叉樹中所有結點,主要指非空二叉樹,對於空二叉樹則結束返回。二叉樹的遍歷主要包括前序遍歷、中序遍歷、後序遍歷。
一棵二叉樹由根結點、左子樹和右子樹三部分組成,若規定 D、L、R 分別代表遍歷根結點、遍歷左子樹、遍歷右子樹,則二叉樹的遍歷方式有 6 種:DLR、DRL、LDR、LRD、RDL、RLD。由於先遍歷左子樹和先遍歷右子樹在算法設計上沒有本質區別,所以默認都是先左後右,故而只討論三種方式:
- DLR--前序遍歷(根在前,從左往右,首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,根->左->右)
- LDR--中序遍歷(根在中,從左往右,首先遍歷左子樹,然後訪問根節點,最後遍歷右子樹,左->根->右)
- LRD--後序遍歷(根在後,從左往右,首先遍歷左子樹,然後遍歷右子樹,最後訪問根節點,左->右->根)
- 層序遍歷(除此之外,還有一種層序遍歷,層序遍歷嘛,就是按層,從上到下,從左到右遍歷,這個沒啥好說的)
所以前中後序遍歷的前/中/後,指的是根節點在前/中/後輸出的意思,因此這三種遍歷也稱爲先根遍歷,中根遍歷,後根遍歷。
本文就不掉書袋再複述前序/中序/後序遍歷的教科書方法了。我們這裏介紹一種易記的方法。
1 先序遍歷
先序遍歷可以想象成,小人從樹根開始繞着整棵樹的外圍轉一圈,經過結點的順序就是先序遍歷的順序
先序遍歷結果:ABDHIEJCFKG
2 中序遍歷
中序遍歷可以想象成,按樹畫好的左右位置投影下來就可以了
中序遍歷結果:HDIBEJAFKCG
3 後序遍歷
後序遍歷就像是剪葡萄,我們要把一串葡萄剪成一顆一顆的。還記得我們先序遍歷繞圈的路線麼?就是圍着樹的外圍繞一圈,如果發現一剪刀就能剪下的一顆葡萄(注意必須是一顆葡萄),就把它剪下來,組成的就是後序遍歷了。
後序遍歷結果:HIDJEBKFGCA
4 層序遍歷
層序遍歷太簡單了,就是按照一層一層的順序,從左到右寫下來就行了。
後序遍歷結果:ABCDEFGHIJK