亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

數據結構知識——樹的三種不同遍歷算法解析

系統 1696 0
樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結點的系統的訪問,即依次對樹中每個結點訪問一次且僅訪問一次。樹的3種最重要的遍歷方式分別稱為前序遍歷、中序遍歷和后序遍歷。以這3種方式遍歷一棵樹時,若按訪問結點的先后次序將結點排列起來,就可分別得到樹中所有結點的前序列表,中序列表和后序列表。相應的結點次序分別稱為結點的前序、中序和后序。

樹的這3種遍歷方式可遞歸地定義如下:

如果T是一棵空樹,那么對T進行前序遍歷、中序遍歷和后序遍歷都是空操作,得到的列表為空表。

如果T是一棵單結點樹,那么對T進行前序遍歷、中序遍歷和后序遍歷都只訪問這個結點。這個結點本身就是要得到的相應列表。

否則,設T如圖6所示,它以n為樹根,樹根的子樹從左到右依次為T1,T2,..,Tk,那么有:

對T進行前序遍歷是先訪問樹根n,然后依次前序遍歷T1,T2,..,Tk。

對T進行中序遍歷是先中序遍歷T1,然后訪問樹根n,接著依次對T2,T2,..,Tk進行中序遍歷。

對T進行后序遍歷是先依次對T1,T2,..,Tk進行后序遍歷,最后訪問樹根n。

數據結構知識——樹的三種不同遍歷算法解析

圖6 樹T



前序遍歷和中序遍歷可形式地依次描述如下

三種遍歷可以形式地描述如下,其中用到了樹的ADT操作:

Procedure Preorder_Traversal(v:NodeType); {前序遍歷算法}

begin

Visite(v); {訪問節點v}

i:=Leftmost_Child(v);

while i<>∧ do

begin

Preorder_Traversal(i);{從左到右依次訪問v的每一個兒子節點i}

i:=Right_Sibling(i);

end;

end;

Procedure Inorder_Traversal(v:NodeType); {中序遍歷算法}

begin

if Leftmost_Child(v)=∧ {判斷v是否是葉節點}

then Visite(v)

else

begin

Inorder_Traversal(Leftmost_Child(v)); {中序遍歷v的左邊第一個兒子節點}

Visite(v); {訪問節點v}

i:=Right_Sibling(Leftmost_Child(v)); {i=v的左邊第二個兒子}

while i<>∧ do

begin

Inorder_Traversal(i);

{從左邊第二個開始到最右邊一個為止依次訪問v的每一個兒子節點i}

i:=Right_Sibling(i);

end;

end;

end;

Procedure Postorder_Traversal(v:NodeType); {后序遍歷算法}

begin

i:=Leftmost_Child(v);

while i<>∧ do

begin

Preorder_Traversal(i);{從左到右依次訪問v的每一個兒子節點i}

i:=Right_Sibling(i);

end;

Visite(v); {訪問節點v}

end;

為了將一棵樹中所有結點按某種次序列表,只須對樹根調用相應過程。例如對圖7中的樹進行前序遍歷、中序遍歷和后序遍歷將分別得到前序列表:A B E F I J C D G H;中序列表:E B I F J A C G D H;后序列表:E I J F B C G H D A。

數據結構知識——樹的三種不同遍歷算法解析

圖7 一棵樹



下面介紹一種方法可以產生上述3種遍歷方式的結點列表。設想我們從樹根出發,依逆時針方向沿樹的外緣繞行(例如圍繞圖7中的樹繞行的路線如圖8所示)。繞行途中可能多次經過同一結點。如果我們按第一次經過的時間次序將各個結點列表,就可以得到前序列表;如果按最后一次經過的時間次序列表,也就是在即將離開某一結點走向其父親時將該結點列出,就得到后序列表。為了產生中序列表,要將葉結點與內部結點加以區別。葉結點在第一次經過時列出,而內部結點在第二次經過時列出。

數據結構知識——樹的三種不同遍歷算法解析

圖8 樹的遍歷





在上述3種不同次序的列表方式中,各樹葉之間的相對次序是相同的,它們都按樹葉之間從左到右的次序排列。3種列表方式的差別僅在于內部結點之間以及內部結點與樹葉之間的次序有所不同。

一棵樹進行前序列表或后序列表有助于查詢結點間的祖先子孫關系。假設結點v在后序列表中的序號(整數)為postorder(v),我們稱這個整數為結點v的后序編號。例如在圖7中,結點E,I和J的后序編號分別為1,2和3。

結點的后序編號具有這樣的特點:設結點v的真子孫個數為desc(v),那么在以v為根的子樹中的所有結點的后序編號恰好落在postorder(v)-desc(v)與postorder(v)之間。因此為了檢驗結點x是否為結點y的子孫,我們只要判斷它們的后序編號是否滿足:

postorder(y)-desc(y)≤postorder(x)≤postorder(y)

前序編號也具有類似的性質。

數據結構知識——樹的三種不同遍歷算法解析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美人一级淫片a免费播放 欧美人与zoxxxx另类9 | 岛国毛片一级一级特级毛片 | 日本不卡不码高清免费观看 | 国产欧美日韩中文字幕 | 青青青免费手机版视频在线观看 | 九九热精品视频在线 | 亚洲精品国产第一区第二区国 | 九九九九精品视频在线播放 | 国产色综合天天综合网 | 国产一级毛片在线 | 手机看片一区二区 | 永久黄网站色视频免费 | 99精彩视频在线观看 | 国产成人精品高清不卡在线 | 婷婷激情四月 | 毛片免费观看网址 | 国产综合亚洲欧美日韩一区二区 | 波多野一区二区三区在线 | 色狠狠综合 | 日韩a一级欧美一级 | 999毛片免费观看 | 成人免费视频在 | 亚洲精品欧美精品中文字幕 | 老司机午夜精品视频你懂的 | 亚洲一级毛片在线播放 | 久久草草 | 中文字幕一区二区三区精彩视频 | 日本精品高清一区二区不卡 | 久久精品国产只有精品6 | 色视频在线观看视频 | 免费一看一级毛片 | 乱色美www女麻豆 | 久久久久久免费精品视频 | 99国产视频| 久久国产亚洲欧美日韩精品 | 欧美精品综合一区二区三区 | 国产精品成人免费视频不卡 | 人人爱天天做夜夜爽 | 久久中文亚洲国产 | 日本午夜www高清视频 | 国产精品99在线观看 |