天天看點

二叉樹前序、中序和後序的互求

最近複習了二叉樹的前、中、後序,把它整理了一下,和大家分享,也便于日後複習用。

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

繼續閱讀