首先,咱們看看前序、中序、後序遍歷的特性: 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、已知前序、後序遍歷,求中序遍歷
這種狀況,可能沒法還原出惟一的二叉樹,由於沒法惟一肯定根節點的左右子樹。
(其實還不大清楚具體的證實和緣由,歡迎指教)