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