最近複習了二叉樹的前、中、後序,把它整理了一下,和大家分享,也便于日後複習用。
1、 首先,我們看看前序、中序、後序周遊的特性:
前序周遊:首先通路根節點,其次通路左子樹,最後通路右子樹。在周遊左、右子樹時,仍然先通路根節點,然後周遊其左子樹,最後周遊其右子樹。(根->左->右)
中序周遊:首先通路左子樹,其次通路根節點,最後通路右子樹。在周遊左、右子樹時,仍然先周遊左子樹,再通路根結點,最後周遊右子樹。(左-.>根->右)
後序周遊:首先通路左子樹,其次通路右子樹,最後通路根節點。在周遊左、右子樹時,仍然先周遊左子樹,然後周遊右子樹,最後周遊根結點。(左->右->根)
A
/ \
B C
/ \ / \
D E F J
上圖前序周遊:ABDECFJ
中序周遊:DBEAFCJ
後序周遊:DEBFJCA
2、已知前序周遊和中序周遊,求後序周遊
若已知前序周遊結果為ABDECFJ,中序周遊結果為DBEAFCJ,問求後序周遊的結果?
對于這樣的問題,我們選擇先畫出整棵樹,然後再對其進行後序周遊。
如何畫樹:
第一步:根據前序周遊的特點,我們知道根結點為A
A
第二步:觀察中序周遊DBEAFCJ。其中root節點A左側的DBE必然是root的左子樹,G右側的FCJ必然是root的右子樹。
A
/ \
(DBE) ( FCJ)
第三步,觀察左子樹DBE,在前序周遊中,大樹的root的leftchild位于root之後,即A之後,是以左子樹的根節點為B。
A
/
B
第四步,同樣的道理,root的右子樹節點FCJ中的根節點也可以通過前序周遊求得。在前序周遊中,一定是先把root和root的所有左子樹節點周遊完之後才會周遊右子樹,并且周遊的左子樹的第一個節點就是左子樹的根節點。同理,周遊的右子樹的第一個節點就是右子樹的根節點,是以C是右子樹的跟節點。
A
/ \
B C
第五步,由中序周遊知B左邊的D是其左子樹,E是B的右子樹,同理F是C的左子樹,J是C 的右子樹。
A
/ \
B C
/ \ / \
D E F J
最後,觀察發現,上面的過程是遞歸的。先找到目前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。由此上述二叉樹的後序周遊為DEBFJCA
3、已知中序周遊和後序周遊,求前序周遊。
若已知中序周遊結果為DBEAFCJ,後序周遊結果為DEBFJCA,問求前序周遊的結果。我們依然選擇先畫出整棵樹,然後再對其進行後序周遊。
第一步,根據後序周遊的特點,我們知道後序周遊最後一個結點即為根結點,即根結點為A。
A
第二步,觀察中序周遊DBEAFCJ。其中root節點G左側的DBE必然是root的左子樹,G右側的FCJ必然是root的右子樹。
A
/ \
(DBE) (FCJ)
第三步,觀察左子樹DBE,在後序周遊中root左子樹的周遊順序是DEB,由後序周遊的順序知B是leftchild的根節點,即root的左子樹。
A
/
B
第四步,同理觀察右子樹FCJ,在後序周遊中root右子樹的周遊順序是FJC,是以C是root的右子樹。
A
/ \
B C
第五步,由中序周遊知D、E分别是B的左右子樹,F、J是C的左右子樹。
A
/ \
B C
/ \ / \
D E F J
第五步,觀察發現,上面的過程是遞歸的。先找到目前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。由此上述數的前序周遊為ABDECFJ