一、易懂的形象理解
其實從名字就可以很好的理解這三種遍歷,我在第二點時候說,但是估計能翻到我的文的同學們之前肯定看過好多類似的了,那咱們換個思路~ 先用我想的一種簡單易懂的形象思維理解一下前序、中序、后序 +層序!
1、先序遍歷
先序遍歷可以想象成,小人從樹根開始繞着整棵樹的外圍轉一圈,經過結點的順序就是先序遍歷的順序
先序遍歷結果:ABDHIEJCFKG
讓我們來看下動畫,和小人兒一起跑兩遍就記住啦,記住是繞着外圍跑哦
2、中序遍歷
中序遍歷可以想象成,按樹畫好的左右位置投影下來就可以了
中序遍歷結果:HDIBEJAFKCG
下面看下投影的過程動畫,其實就是按左右順序寫下來就行了
3、后序遍歷
后序遍歷就像是剪葡萄,我們要把一串葡萄剪成一顆一顆的。
還記得我們先序遍歷繞圈的路線么?
就是圍着樹的外圍繞一圈,如果發現一剪刀就能剪下的葡萄(必須是一顆葡萄),就把它剪下來,組成的就是后序遍歷了。
后序遍歷結果:HIDJEBKFGCA
讓我們來看下動畫
4、層序遍歷
層序遍歷太簡單了,就是按照一層一層的順序,從左到右寫下來就行了。
后序遍歷結果:ABCDEFGHIJK
不知道通過這種方式,有沒有覺得閉着眼睛都能寫出前序、中序、后序 、層序了呀,不過這只是為了大家好理解,我想出的一種形象思維,為了用代碼實現,我們還需要具體了解一下前序、中序、后序遍歷。
二、真正理解三種遍歷
來,讓我們先把所有空結點都補上。
還記得我們先序和后序遍歷時候跑的順序么?按照這個順序再跑一次,就是圍着樹的外圍跑一整圈。
讓我們來理解一下繞着外圍跑一整圈的真正含義是:遍歷所有結點時,都先往左孩子走,再往右孩子走。
觀察一下,你有什么發現?
有沒有發現,除了根結點和空結點,其他所有結點都有三個箭頭指向它。
一個是從它的父節點指向它,一個是從它的左孩子指向它,一個是從它的右孩子指向它。
一個結點有三個箭頭指向它,說明每個結點都被經過了三遍。一遍是從它的父節點來的時候,一遍是從它的左孩子返回時,一遍是從它的右孩子返回時。
其實我們在用遞歸算法實現二叉樹的遍歷的時候,不管是先序中序還是后序,程序都是按照上面那個順序跑遍所有結點的。
先序中序和后序唯一的不同就是,在經過結點的三次中,哪次訪問(輸出或者打印或者做其他操作)了這個結點。有點像大禹治水三過家門,他會選擇一次進去。
先序遍歷顧名思義,就是在第一次經過這個結點的時候訪問了它。就是從父節點來的這個箭頭的時候,訪問了它。
中序遍歷也和名字一樣,就是在第二次經過這個結點的時候訪問了它。就是從左孩子返回的這個箭頭的時候,訪問了它。
后序遍歷,就是在第三次經過這個結點的時候訪問了它。就是從右孩子返回的這個箭頭的時候,訪問了它。
怎么樣,這樣有沒有很好的理解?其實不管是前序中序還是后序,在程序里跑的時候都是按照同樣的順序跑的,每個結點經過三遍,第幾遍訪問這個結點了,就叫什么序遍歷。
zz:https://www.pianshen.com/article/7106254596/