首先說明,這只是我個人的一些理解與體會,我寫下來是想讓自己能隨時隨地複習與思考,並不是說想去教人家,所以其中可能會有些我個人理解不對的地方,這也正是我寫部落格的原因,這樣才能不斷進步,當然如果對讀者有用的話,一起共勉。
今天我想記的是二叉樹的遍歷(先中後三種)。
我們都知道二叉樹的遍歷有四種,分別是先序遍歷(也叫前序遍歷),中序遍歷,後序遍歷以及層序遍歷,在這裡我不講層序遍歷(層序遍歷是分別都從從每一層的左邊向右邊遍歷)。以下的圖是我自己畫的,將就點看就行。
我們都知道二叉樹分為根節點,左孩子,右孩子三部分,所以所謂先序中序後序遍歷,其實也就是訪問根節點的順序,首先,先序遍歷,即為訪問根節點->訪問左孩子->
訪問右孩子。 其次,中序遍歷,即為訪問左孩子->訪問根節點->訪問右孩子。最後,以此類推,後序遍歷就是訪問右孩子->訪問左孩子->訪問根節點。
然後有一點,這樣不斷的訪問,縮小範圍,實質上也是乙個遞迴的過程,乙個表面上的遞迴過程。在我的理解中,遞迴,就是不斷不斷的縮小同種型別的範圍,當到達某個點後,就開始不斷往回走,這在二叉樹的遍歷中就能表現出來,本身二叉樹遍歷的**就是乙個遞迴的過程。
先序遍歷:訪問根節點->訪問左孩子->訪問右孩子。
如上圖,我們按照順序來,先訪問根節點,毫無疑問,先是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。
所以三種遍歷方式就是這樣,因為我畫的樹比較小,所以遞迴的效果不是很明顯的看出來,大家可以試著畫棵大點的樹,不斷縮小縮小,然後又層層返回,就能形象的理解遞迴了。
二叉樹,先 中 後,遍歷
建議大家在小本本上,模擬一下,遍歷路徑,才能更好的理解 如下 package class 04 import j a.util.stack public class code 01 preinpostr ersal public static void preorderrecur node head...
二叉樹 非遞迴遍歷(先 中 後)
include include include define maxsize 20 最多結點個數 using namespace std 二叉鍊錶 typedef struct bnodebnode,btree 順序棧 typedef btree datatype typedef structseq...
二叉樹的先中後序遍歷
二叉樹的先中後序遍歷 package com.treenode 二叉樹先中後順序遞迴遍歷 public class diguibianli 先序遍歷 public static void preorder node head preorder head.left preorder head.righ...