【圖解數據結構】 一組動畫完全理解二叉樹三種遍歷

二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中全部結點,使得每一個結點被訪問一次且僅被訪問一次。動畫

在二叉樹的遍歷中存在三種較爲經常使用的遍歷方式:前序遍歷、中序遍歷、後序遍歷。接下來我將嘗試着用三組動畫向讀者詳細的介紹這三種遍歷方式的邏輯思路,但願讓讀者看到任何的二叉樹都能在腦海中快速的勾勒出動畫。3d

前提

在介紹這三組動畫前,咱們先用圖來介紹一下二叉樹的建立以及動畫中的一些約定說明。code

如圖所示是二叉樹中的一個節點,這個節點有左子樹與右子樹,經過兩根綠色的鏈接線,將此節點劃分紅了三個區域,咱們分別用前、中、後這三個輔助點來表示。cdn

這三個點代表在二叉樹的遍歷中何時要取出此節點的值。blog

任何一個節點去遍歷都是 前-左綠線-中-右綠線-後 這樣的順序遍歷的。遞歸

前序遍歷

使用遞歸方式實現前序遍歷的具體過程爲:it

  • 先訪問根節點
  • 再序遍歷左子樹
  • 最後序遍歷右子樹

咱們來對上面的動畫進行一個充分的說明來理解前序遍歷的遞歸實現方式。io

  • 首先訪問了28這個節點,咱們看前輔助點,因爲是前序遍歷,那麼此刻咱們取出該節點的值28
  • 然後經過左綠線訪問28的左子樹
  • 16這個節點中,咱們看前輔助點,因爲是前序遍歷,取出該節點的值16
  • 經過左綠線訪問16的左子樹
  • 13這個節點中,咱們看前輔助點,因爲是前序遍歷,取出該節點的值13
  • 13這個節點左子樹爲空,那麼咱們左綠線就沒有,而後看中輔助點,因爲是前序遍歷,所以不作處理
  • 13這個節點右子樹爲空,那麼咱們右綠線就沒有,而後看後輔助點,因爲是前序遍歷,所以不作處理
  • 然後回到16這個節點中,看中輔助點,因爲是前序遍歷,所以不作處理
  • 然後看16這個節點的右子樹22這個節點,看前輔助點,因爲是前序遍歷,取出該節點的值22
  • 。。。

代碼實現:

中序遍歷

使用遞歸方式實現中序遍歷的具體過程爲:class

  • 先中序遍歷左子樹
  • 再訪問根節點
  • 最後中序遍歷右子樹

咱們來對上面的動畫進行一個充分的說明來理解中序遍歷的遞歸實現方式。二叉樹

  • 首先訪問了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
  • 。。。

代碼實現:

歡迎關注:

相關文章
相關標籤/搜索