详细易懂的二叉树遍历(先中后)
首先說明,這只是我個人的一些理解與體會,我寫下來是想讓自己能隨時隨地復習與思考,并不是說想去教人家,所以其中可能會有些我個人理解不對的地方,這也正是我寫博客的原因,這樣才能不斷進步,當然如果對讀者有用的話,一起共勉。
?
今天我想記的是二叉樹的遍歷(先中后三種)。
我們都知道二叉樹的遍歷有四種,分別是先序遍歷(也叫前序遍歷),中序遍歷,后序遍歷以及層序遍歷,在這里我不講層序遍歷(層序遍歷是分別都從從每一層的左邊向右邊遍歷)。以下的圖是我自己畫的,將就點看就行。
? ? ? ? ? ? ? ? ? ??
?
? ?
我們都知道二叉樹分為根節點,左孩子,右孩子三部分,所以所謂先序中序后序遍歷,其實也就是訪問根節點的順序,首先,先序遍歷,即為訪問根節點->訪問左孩子->訪問右孩子。?其次,中序遍歷,即為訪問左孩子->訪問根節點->訪問右孩子。最后,以此類推,后序遍歷就是訪問右孩子->訪問左孩子->訪問根節點。
?
然后有一點,這樣不斷的訪問,縮小范圍,實質上也是一個遞歸的過程,一個表面上的遞歸過程。在我的理解中,遞歸,就是不斷不斷的縮小同種類型的范圍,當到達某個點后,就開始不斷往回走,這在二叉樹的遍歷中就能表現出來,本身二叉樹遍歷的代碼就是一個遞歸的過程。
?
先序遍歷:訪問根節點->訪問左孩子->訪問右孩子。
如上圖,我們按照順序來,先訪問根節點,毫無疑問,先是A,然后訪問A的左孩子,然后,遞歸的形象化就出來了。因為A的左孩子又是一顆二叉樹,如上面所說,縮小范圍,所以,BCD就是一顆“新”二叉樹,我們繼續訪問根節點,為B,然后訪問左孩子,B的左孩子是C,其實,C也是一顆樹,只不過它是一顆左右孩子都為空的樹,繼續訪問根節點,為C。你看,對于BCD這棵樹(以下二叉樹我都簡稱為樹)而言,根->B,左孩子->C,右孩子->D,所以它就訪問結束了。然而,當BCD樹訪問完了,對于整個樹來說,即A的左孩子,也訪問完了,所以又像上面說的“往回走”。所以接下來輪到訪問A的右孩子,對于E,為“新樹EF”的根節點,訪問,為E,E的左孩子為空,然后到右孩子,為F,F的左右都為空,至此,A的右孩子訪問結束,所以,對于此樹,先序遍歷的結果為ABCDEF?。
?
中序遍歷:訪問左孩子->訪問根節點->訪問右孩子。
中序遍歷也是如此的道理,先是訪問左孩子,左孩子還有左孩子,遞歸下去,訪問,為C,然后到根節點,為B,再到右孩子,為D,然后,對于整棵樹而言,左孩子訪問結束,輪到根節點,為A,然后,右孩子,對于“EF樹”來說,左孩子為空,根節點為E,右孩子為F,所以分別是為E,為F,至此,整棵樹的右孩子也訪問結束。所以,對于此樹,中序遍歷的結果為CBDAEF。
?
后序遍歷:訪問左孩子->訪問右孩子?->訪問根節點。
相信經過前兩個的說明,大家也能掌握后序遍歷的情況了,我們直接來,左孩子,“BCD”,繼續左孩子,為C,右孩子,為D,根節點,為B,再到整棵樹的右孩子“EF”,左孩子,為空,右孩子,為F,根節點,為E,左右結束,根節點,為A。對于此樹,中序遍歷的結果為CDBFEA。
?
所以三種遍歷方式就是這樣,因為我畫的樹比較小,所以遞歸的效果不是很明顯的看出來,大家可以試著畫棵大點的樹,不斷縮小縮小,然后又層層返回,就能形象的理解遞歸了。
?
?
轉載于:https://www.cnblogs.com/yellowgg/p/6735293.html
總結
以上是生活随笔為你收集整理的详细易懂的二叉树遍历(先中后)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: atCoder Ants on a Ci
- 下一篇: codevs——2853 方格游戏(棋盘