二叉樹遍歷案例--詳解 (前序遍歷、中序遍歷、後序遍歷)

一:前序遍歷

對於當前節點,先輸出該節點,然後輸出它的左孩子,最後輸出它的右孩子。

即根結點 ---> 左子樹 ---> 右子樹。以上圖爲例,遞歸的過程如下:

 

  1. 首先輸出根節點1。

  2. 輸出左兒子2。

  3. 因爲2沒有左兒子,所以輸出下一個,即輸出右兒子5。

  4. 因爲5沒有左兒子,所以輸出下一個,即輸出右兒子8。

  5. 至此根的左兒子都輸出完畢,開始輸出它即1的右兒子,右兒子第一個爲3。

  6. 輸出3的左兒子6。

  7. 輸出3的右兒子7。

  8. 至此全部輸出完畢,結束。

所以輸出的結果前序遍歷結果是:1  2  5  8  3  6  7

 

二:中序遍歷

首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。若二叉樹爲空則結束返回。

即左子樹---> 根結點 ---> 右子樹。以上圖爲例,對左右子樹分別進行左兒子-->自己-->右兒子輸出,遞歸的過程如下:

  1. 首先輸出左兒子,因爲2沒有左兒子,所以輸出自己2。

  2. 準備輸出2的右兒子5,若5有左兒子,則輸出該元素,現在因爲5沒有左兒子,所以輸出5。

  3. 輸出5的右兒子8。

  4. 至此左子樹輸出完畢,輸出根節點1。

  5. 開始輸出右子樹,因爲3有左子樹,所以首先輸出6,然後輸出3。

  6. 輸出3的右子樹7。

  7. 至此全部輸出結束。

所以輸出的結果中序遍歷結果是:2  5  8  1  6  3  7

 

三:後序遍歷

對於當前結點,先輸出它的左孩子,然後輸出它的右孩子,最後輸出該結點。即左子樹 ---> 右子樹 ---> 根結點 遞歸的過程如下:
 

  1. 首先輸出左子樹,因爲2有右孩子5,而5又有右兒子,所以先輸出8。

  2. 輸出8之後,輸出自己5。

  3. 然後輸出節點2。

  4. 至此左子樹遍歷完畢,開始遍歷右子樹,因爲3有左子樹,所以輸出6,輸出右子樹7,最後輸出自己3。

  5. 最後輸出根節點1。

  6. 至此全部輸出完畢。

所以輸出的結果後序遍歷結果是:8  5  2  6  7  3  1

 

四:講完了左右子樹的概念之後,我們根據前序遍歷中序遍歷推導樹的結構。

前序遍歷:1  2  5  8  3  6  7

中序遍歷:2  5  8  1  6  3  7

  1. 首先知道前序遍歷的第一個節點是根節點1,可以通過該節點1在中序遍歷中把子樹分成左右子樹,即左子樹中有2  5  8,右子樹中右6  3  7

  2. 根據前序遍歷的特點,我們可以得到2是左子樹的根節點。

  3. 那麼5,8的具體的位置,我們無法從前序遍歷中得到結果,那麼我們是否可以從中序遍歷中獲取結果呢?根據中序遍歷的特點(左兒子-->自己-->右兒子)我們可以得到5是2的右兒子。

  4. 再來看8,因爲5是2的右兒子,所以8不可能是2的兒子,8只能是5的兒子,那麼8是5的左兒子還是右兒子呢?假設8是5的左兒子,那麼不滿足中序遍歷的2  5  8,而應該是2  8  5,所以8是5的右兒子。

  5. 至此左子樹的排序完成。

  6. 再來看右邊的6  3   7。

  7. 根據前序遍歷,去掉2  5  8,可得3  6  7,那麼3是右子樹的根節點。

  8. 再根據中序遍歷的特點,因爲右子樹是6  3   7,所以6是3的左兒子,7是3的右兒子。

  9. 至此右子樹的分析也結束了。

至此我們得到了整棵數的結構。

 

五:我們根據中序遍歷後序遍歷推導樹的結構。

中序遍歷:2  5  8  1  6  3  7

後序遍歷:8  5  2  6  7  3  1

  1. 根據後序遍歷的特點,即根節點是後序遍歷的最後一個節點1,可以通過1,在中序遍歷中把樹分成左子樹和右子樹,即1的左半部分爲左子樹2  5  8,右子樹6  3  7。

  2. 根據後序遍歷的特點是左子樹-->右子樹-->自己,所以8  5  2中2是左子樹的根節點。

  3. 根據中序遍歷,5  8在2的右邊,所以只能是2的右子樹的元素,又2只會有一個右兒子,所以5是2的右兒子,最後剩下8是5的什麼兒子呢?根據中序遍歷的特點,若8是5左兒子,那麼中序遍歷應該是2  8  5,所以8是5的右兒子。

  4. 至此1的左子樹排序完成。

  5. 再看6  3  7,根據後序遍歷,可得3是右子樹的根節點,再看中序遍歷,6  3  7,所以6 7分別是3的左兒子和右兒子。

  6. 至此右子樹排序完成。

至此我們得到了整棵數的結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章