二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。
在二叉樹的遍歷中存在三種較為常用的遍歷方式:前序遍歷、中序遍歷、後序遍歷。接下來我將嘗試著用三組動畫向讀者詳細的介紹這三種遍歷方式的邏輯思路,希望讓讀者看到任何的二叉樹都能在腦海中快速的勾勒出動畫。
前提
在介紹這三組動畫前,我們先用圖來介紹一下二叉樹的建立以及動畫中的一些約定說明。
如圖所示是二叉樹中的一個節點,這個節點有左子樹與右子樹,通過兩根綠色的連線線,將此節點劃分成了三個區域,我們分別用前、中、後這三個輔助點來表示。
這三個點表明在二叉樹的遍歷中什麼時候要取出此節點的值。
任何一個節點去遍歷都是 前-左綠線-中-右綠線-後 這樣的順序遍歷的。
前序遍歷
使用遞迴方式實現前序遍歷的具體過程為:
- 先訪問根節點
- 再序遍歷左子樹
- 最後序遍歷右子樹
我們來對上面的動畫進行一個充分的說明來理解前序遍歷的遞迴實現方式。
- 首先訪問了
28
這個節點,我們看前輔助點
,由於是前序遍歷,那麼此刻我們取出該節點的值28
- 而後通過左綠線訪問
28
的左子樹 - 在
16
這個節點中,我們看前輔助點
,由於是前序遍歷,取出該節點的值16
- 通過左綠線訪問
16
的左子樹 - 在
13
這個節點中,我們看前輔助點
,由於是前序遍歷,取出該節點的值13
13
這個節點左子樹為空,那麼我們左綠線就沒有,然後看中輔助點
,由於是前序遍歷,因此不做處理13
這個節點右子樹為空,那麼我們右綠線就沒有,然後看後輔助點
,由於是前序遍歷,因此不做處理- 而後回到
16
這個節點中,看中輔助點
,由於是前序遍歷,因此不做處理 - 而後看
16
這個節點的右子樹22
這個節點,看前輔助點
,由於是前序遍歷,取出該節點的值22
- 。。。
程式碼實現:
中序遍歷
使用遞迴方式實現中序遍歷的具體過程為:
- 先中序遍歷左子樹
- 再訪問根節點
- 最後中序遍歷右子樹
我們來對上面的動畫進行一個充分的說明來理解中序遍歷的遞迴實現方式。
- 首先訪問了
28
這個節點,我們看前輔助點
,由於是中序遍歷,因此不做處理 - 而後通過左綠線訪問
28
的左子樹 - 在
16
這個節點中,我們看前輔助點
,由於是中序遍歷,因此不做處理 - 通過左綠線訪問
16
的左子樹 - 在
13
這個節點中,我們看前輔助點
,由於是中序遍歷,因此不做處理 13
這個節點左子樹為空,那麼我們左綠線就沒有,然後看中輔助點
,由於是中序遍歷,取出該節點的值13
13
這個節點右子樹為空,那麼我們右綠線就沒有,然後看後輔助點
,由於是中序遍歷,因此不做處理- 而後回到
16
這個節點中,看中輔助點
,由於是中序遍歷,取出該節點的值16
- 而後看
16
這個節點的右子樹22
這個節點,看前輔助點
,由於是中序遍歷,因此不做處理 - 看
中輔助點
,由於是中序遍歷,取出該節點的值22
- 。。。
程式碼實現:
後序遍歷
使用遞迴方式實現後序遍歷的具體過程為:
- 先後序遍歷左子樹
- 再後序遍歷右子樹
- 最後訪問根節點
我們來對上面的動畫進行一個充分的說明來理解後序遍歷的遞迴實現方式。
- 首先訪問了
28
這個節點,我們看前輔助點
,由於是後序遍歷,因此不做處理 - 而後通過左綠線訪問
28
的左子樹 - 在
16
這個節點中,我們看前輔助點
,由於是後序遍歷,因此不做處理 - 通過左綠線訪問
16
的左子樹 - 在
13
這個節點中,我們看前輔助點
,由於是後序遍歷,因此不做處理 13
這個節點左子樹為空,那麼我們左綠線就沒有,然後看中輔助點
,由於是後序遍歷,因此不做處理13
這個節點右子樹為空,那麼我們右綠線就沒有,然後看後輔助點
,由於是後序遍歷,取出該節點的值13
- 而後回到
16
這個節點中,看中輔助點
,由於是後序遍歷,因此不做處理 - 而後看
16
這個節點的右子樹22
這個節點,看前輔助點
,由於是中序遍歷,因此不做處理 - 看
中輔助點
,由於是後序遍歷,因此不做處理 - 看
後輔助點
,由於是後序遍歷,取出該節點的值16
- 。。。