還原二叉樹--已知先序中序或者後序中序

     

首先,咱們看看前序、中序、後序遍歷的特性:  spa


前序遍歷: 
    1.訪問根節點 
    2.前序遍歷左子樹 
    3.前序遍歷右子樹  orm

(我的以爲這個命名略微有誤導性,由於前序的「前」容易讓人誤會成樹的最前邊(視覺上的左邊)。記住前序遍歷就是最直接(直覺上的)遍歷——中左右) 遞歸


中序遍歷: 
    1.中序遍歷左子樹 
    2.訪問根節點 
    3.中序遍歷右子樹  二叉樹

(一樣是有誤導性的名字。 遍歷順序——左中右) 遍歷


後序遍歷: 
    1.後序遍歷左子樹 
    2.後序遍歷右子樹 
    3.訪問根節點 im

(一樣是有誤導性的名字,「後」字沒有任何意義,全部二叉樹的遍歷,左邊必定在右邊的以前進行遍歷。 遍歷順序——左右中。) 命名


接着,銘記總的方針 img

1. 找到根節點,肯定左子樹,肯定右子樹 (最重要) di

2. 對左子樹進行遞歸分析 co

3.對右子樹進行遞歸分析



1、已知先序、中序遍歷,求後序遍歷

例:

先序遍歷:         GDAFEMHZ

中序遍歷:         ADEFGHMZ

思路分析:

1. 根據先序遍歷的特色——中左右,第一個元素必定是根節點,因此馬上肯定G是根節點。

2. 既然肯定了G是根節點,再根據中序遍歷的特色——左中右,在根節點G以前的ADEF就是左子樹,根節點G以後的HMZ就是右子樹。

3.接着分析左子樹(思路和第1,2步同樣)。把左子樹的全部元素(即ADEF這四個元素)在先序遍歷和中序遍歷中的順序拿出來進行比較。

先序的順序是DAFE(中左右),中序遍歷是ADEF(左中右)。

經過先序特色得出D是左子樹的節點,經過中序特色肯定惟一一個在D左邊的A是左子樹中的左葉子,右邊的是EF。

觀察EF的相對位置,在先序(中左右)是FE,在中序(左中右)EF,因此得出EF的關係是左中。

到此得出左子樹的形狀


4.接着分析右子樹(思路和第1,2步同樣),把右子樹的元素(HMZ)在先序遍歷和中序遍歷中的順序拿出來進行比較。

先序的順序是MHZ(中左右),中序遍歷是HMZ(左中右)。

根據先序遍歷的特色肯定M是右子樹的節點,根據中序遍歷的特色肯定H是左葉,Z是右葉。

因此右子樹的形狀

5.因而得出了整棵樹的形狀


那麼後序遍歷就是AEFDHZMG



2、已知中序和後序遍歷,求前序遍歷

中序遍歷:       ADEFGHMZ

後序遍歷:       AEFDHZMG

思路分析:(記住方針是同樣的)

1.根據後序遍歷的特色(左右中),根節點在結尾,肯定G是根節點。根據中序遍歷的特色(左中右),肯定ADEF組成左子樹,HMZ組成右子樹。

2.分析左子樹。ADEF這四個元素在後序遍歷(左右中)中的順序是AEFD,在中序遍歷(左中右)中的順序是ADEF。根據後序遍歷(左右中)的特色肯定D是左子樹的節點,根據中序遍歷(左中右)的特色發現A在D前面,因此A是左子樹的左葉子,EF則是左子樹的右分枝。

EF在後序(左右中)和中序(左中右)的相對位置是同樣的,因此EF關係是左右或者左中,排除左右關係(缺少節點),因此EF關係是左中。

到此得出左子樹的形狀


3. 分析右子樹。HMZ這三個元素在中序遍歷(左中右)的順序是HMZ,在後序遍歷(左右中)的順序是HZM。根據後序遍歷(左右中)的特色,M在尾部,即M是右子樹的節點。再根據中序遍歷(左中右)的特色,肯定H(M的前面)是右子樹的左葉子,Z(M的後面)是右子樹的右葉子。

因此右子樹的形狀

4. 最後得出整棵樹的形狀


那麼先序遍歷就是GDAFEMHZ .


3、已知前序、後序遍歷,求中序遍歷

這種狀況,可能沒法還原出惟一的二叉樹,由於沒法惟一肯定根節點的左右子樹。

(其實還不大清楚具體的證實和緣由,歡迎指教)

相關文章
相關標籤/搜索