一:前序遍歷
對於當前節點,先輸出該節點,然後輸出它的左孩子,最後輸出它的右孩子。
即根結點 ---> 左子樹 ---> 右子樹。以上圖爲例,遞歸的過程如下:
-
首先輸出根節點1。
-
輸出左兒子2。
-
因爲2沒有左兒子,所以輸出下一個,即輸出右兒子5。
-
因爲5沒有左兒子,所以輸出下一個,即輸出右兒子8。
-
至此根的左兒子都輸出完畢,開始輸出它即1的右兒子,右兒子第一個爲3。
-
輸出3的左兒子6。
-
輸出3的右兒子7。
-
至此全部輸出完畢,結束。
所以輸出的結果前序遍歷結果是:1 2 5 8 3 6 7
二:中序遍歷
首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。若二叉樹爲空則結束返回。
即左子樹---> 根結點 ---> 右子樹。以上圖爲例,對左右子樹分別進行左兒子-->自己-->右兒子輸出,遞歸的過程如下:
-
首先輸出左兒子,因爲2沒有左兒子,所以輸出自己2。
-
準備輸出2的右兒子5,若5有左兒子,則輸出該元素,現在因爲5沒有左兒子,所以輸出5。
-
輸出5的右兒子8。
-
至此左子樹輸出完畢,輸出根節點1。
-
開始輸出右子樹,因爲3有左子樹,所以首先輸出6,然後輸出3。
-
輸出3的右子樹7。
-
至此全部輸出結束。
所以輸出的結果中序遍歷結果是:2 5 8 1 6 3 7
三:後序遍歷
對於當前結點,先輸出它的左孩子,然後輸出它的右孩子,最後輸出該結點。即左子樹 ---> 右子樹 ---> 根結點 遞歸的過程如下:
-
首先輸出左子樹,因爲2有右孩子5,而5又有右兒子,所以先輸出8。
-
輸出8之後,輸出自己5。
-
然後輸出節點2。
-
至此左子樹遍歷完畢,開始遍歷右子樹,因爲3有左子樹,所以輸出6,輸出右子樹7,最後輸出自己3。
-
最後輸出根節點1。
-
至此全部輸出完畢。
所以輸出的結果後序遍歷結果是:8 5 2 6 7 3 1
四:講完了左右子樹的概念之後,我們根據前序遍歷中序遍歷推導樹的結構。
前序遍歷:1 2 5 8 3 6 7
中序遍歷:2 5 8 1 6 3 7
-
首先知道前序遍歷的第一個節點是根節點1,可以通過該節點1在中序遍歷中把子樹分成左右子樹,即左子樹中有2 5 8,右子樹中右6 3 7
-
根據前序遍歷的特點,我們可以得到2是左子樹的根節點。
-
那麼5,8的具體的位置,我們無法從前序遍歷中得到結果,那麼我們是否可以從中序遍歷中獲取結果呢?根據中序遍歷的特點(左兒子-->自己-->右兒子)我們可以得到5是2的右兒子。
-
再來看8,因爲5是2的右兒子,所以8不可能是2的兒子,8只能是5的兒子,那麼8是5的左兒子還是右兒子呢?假設8是5的左兒子,那麼不滿足中序遍歷的2 5 8,而應該是2 8 5,所以8是5的右兒子。
-
至此左子樹的排序完成。
-
再來看右邊的6 3 7。
-
根據前序遍歷,去掉2 5 8,可得3 6 7,那麼3是右子樹的根節點。
-
再根據中序遍歷的特點,因爲右子樹是6 3 7,所以6是3的左兒子,7是3的右兒子。
-
至此右子樹的分析也結束了。
至此我們得到了整棵數的結構。
五:我們根據中序遍歷後序遍歷推導樹的結構。
中序遍歷:2 5 8 1 6 3 7
後序遍歷:8 5 2 6 7 3 1
-
根據後序遍歷的特點,即根節點是後序遍歷的最後一個節點1,可以通過1,在中序遍歷中把樹分成左子樹和右子樹,即1的左半部分爲左子樹2 5 8,右子樹6 3 7。
-
根據後序遍歷的特點是左子樹-->右子樹-->自己,所以8 5 2中2是左子樹的根節點。
-
根據中序遍歷,5 8在2的右邊,所以只能是2的右子樹的元素,又2只會有一個右兒子,所以5是2的右兒子,最後剩下8是5的什麼兒子呢?根據中序遍歷的特點,若8是5左兒子,那麼中序遍歷應該是2 8 5,所以8是5的右兒子。
-
至此1的左子樹排序完成。
-
再看6 3 7,根據後序遍歷,可得3是右子樹的根節點,再看中序遍歷,6 3 7,所以6 7分別是3的左兒子和右兒子。
-
至此右子樹排序完成。
至此我們得到了整棵數的結構。