演算法實作範例!LeetCode Solutions工程師必學:遍歷二元樹使用中序(inorder)列印

演算法實作範例!LeetCode Solutions工程師必學:遍歷二元樹使用中序(inorder)列印

深智數位資訊講堂 2021-07-09 15:16

LeetCode Solutions工程師必學:遍歷二元樹使用中序(inorder)列印

在這篇文章中,說明二元樹這個資料結構的概念,它在計算機科學中非常重要,有很多演算法都一定會運用到這種資料結構,也是初入職場工程師必刷的leetcode考題。

    假設有一顆二元樹如下:

    所謂中序列印是從左子樹往下走,直到無法前進就處理此節點,接著處理此節點的父節點,然後往右子樹走,如果右子樹無法前進則回到上一層。也可以用另一種解釋,遍歷左子樹(Left,縮寫是L)、根節點(Root,縮寫是D)、遍歷右子樹(Right,縮寫是R),整個遍歷過程簡稱是LDR

    用這個觀念遍歷上述二元樹可以得到下列結果:

    5, 9, 10, 13, 21, 28

    上述中序列印相當於可以得到由小到大的排序結果,如上所示,設計中序列印的遞迴函數步驟如下:

    1:如果左子樹節點存在,則遞迴呼叫self.left.inorder( ),往左子樹走。

    2:處理此節點(會執行此行,是因為左子樹已經不存在)。

    3:如果右子樹節點存在,則遞迴呼叫self.right.inorder( ),往右子樹走。

程式實例ch6_4.py:使用10, 21, 5, 9, 13, 28系列數字建立一個二元樹,然後使用中序方式列印。

 

執行結果

下列二元樹節點左邊的數字是中序遍歷列出節點值的順序。

 

為了方便解說,將節點改為英文字母,然後使用二元樹堆疊分析整個第25-31行遞迴inorder( )函數遍歷過程:

 1:由A進入inorder( )。

2:因為A的左子樹B存在,所以進入B的遞迴inorder( )。

3:B沒有左子樹,所以if B.left … 執行結束,圖形如下:

4:執行print B。

5:因為B的右子樹D存在,所以進入D的遞迴inorder( )。

 6:由於D沒有左子樹,所以if D.left … 執行結束,執行print D。

7:D沒有右子樹,所以if D.right … 執行結束,接下來執行print A。

8:因為A的右子樹C存在,所以進入C的遞迴inorder( )。

 9:因為C的左子樹E存在,所以進入E的遞迴inorder( )。

 10:由於E沒有左子樹,所以if E.left … 執行結束,執行print E。

 11:E沒有右子樹,所以if E.right … 執行結束,接下來執行print C。

12:因為C的右子樹F存在,所以進入F的遞迴inorder( )。

13:由於F沒有左子樹,所以if F.left … 執行結束,執行print F。

14:由於F沒有右子樹,所以執行結束。

    上述節點旁的數值則是列印的順序。

執行結果

 

想閱讀更多請點我

熱門文章
突破135萬人要彈劾賴清德!網路發起連署熱度夯到一度癱瘓網站
突破135萬人要彈劾賴清德!網路發起連署熱度夯到一度癱瘓網站

中天新聞

台中重量級前議長張宏年「家中過世」!家屬哀慟
台中重量級前議長張宏年「家中過世」!家屬哀慟

中天新聞

補教師爆改客廳成影印廠!狂售萬份盜版考卷獲利1500萬 侵權上看180億元
補教師爆改客廳成影印廠!狂售萬份盜版考卷獲利1500萬 侵權上看180億元

CTWANT

古巴拒台灣護照入境!我國「用龍蝦制裁」進口額狂跌逾7成
古巴拒台灣護照入境!我國「用龍蝦制裁」進口額狂跌逾7成

品觀點傳媒

警界再爆噩耗!竹北分局偵查佐車停廟前「陳屍駕駛座」
警界再爆噩耗!竹北分局偵查佐車停廟前「陳屍駕駛座」

中天新聞

年末最適合轉職!有機會升職加薪 五大生肖一次看
年末最適合轉職!有機會升職加薪 五大生肖一次看

藝點新聞

酒駕撞死女23歲清潔員!香酥鴨老闆惡行遭起底 「偷滷味技術」法院打人
酒駕撞死女23歲清潔員!香酥鴨老闆惡行遭起底 「偷滷味技術」法院打人

CTWANT

50
0
分享