資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷

readyao發表於2016-01-22


二叉樹的遍歷規則主要有三種:前序遍歷,中序遍歷,後序遍歷。它們是根據訪問根節點的先後順序來劃分的。

前序遍歷:

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

中序遍歷:

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

後序遍歷:

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

前序遍歷:  GDAFEMHZ
中序遍歷:     ADEFGHMZ
後序遍歷:  AEFDHZMG

前序遍歷的特點:樹的根節點位於所有它的子樹節點之前。
中序遍歷的特點:樹的根節點的前面是它的左子樹節點,它的後面是它的右子樹節點。
後序遍歷的特點:樹的根節點位於最後一個位置。

問題1:已知前序遍歷GDAFEMHZ和中序遍歷ADEFGHMZ,求後序遍歷?

1.前序遍歷的特點是樹的根節點位於所有它的子樹節點之前,所以G是樹根。
2.中序遍歷的特點:樹的根節點的前面是它的左子樹節點,它的後面是它的右子樹節點。所以ADEF是G的左子樹,HMZ是G的右子樹。
3.在子樹ADEF和子樹HMZ中根據上面的思路可以判斷各個節點的位置。
左子樹ADEF中D是根節點,A是D的左節點,EF是D的右子樹。F是E的父節點。
右子樹HMZ中M是根節點,H是左節點,Z是右節點。
見圖示:


問題2:已知後序遍歷AEFDHZMG和中序遍歷ADEFGHMZ,求前序遍歷?
思路同上問。
見圖示:



問題3:已知前序遍歷GDAFEMHZ和後序遍歷AEFDHZMG,求中序遍歷?

1.由後序遍歷的特點可以知道,G是根節點。由前序遍歷的特點也可以知道G是根節點,並且可以知道D是左子樹的根節點,再根據
後序遍歷可以知道AEFD是G的左子樹節點。HZM是G的右子樹節點。

2.後序遍歷AEFD,前序遍歷DAFE中,再根據上面的思路;
3.後序遍歷HZM,前序遍歷MHZ中,再根據上面的思路;
見圖書:


如果是數學式子的情況,針對前兩個問題除了畫出二叉樹的圖形外還有簡單的思路。

問題1.已知中序遍歷:a+b*c-(d+e),求後序遍歷?

首先將表示式按優先順序加上括號,((a+(b*c))-(d+e))
然後將上面運算式中的運算子放到對應括號的後面,結果是:((a+(b*c))-(d+e))  ---》((a(bc)*)+(de)+)-
最後將上面式子中的括號去掉:((a(bc)*)+(de)+)-       ---》 abc*+de+-

問題2.已知中序遍歷:a+b*c-(d+e),求前序遍歷?

首先將表示式按優先順序加上括號,((a+(b*c))-(d+e))
然後將上面運算式中的運算子放到對應括號的前面,結果是:((a+(b*c))-(d+e))  ---》 -(+(a*(bc))+(de))
最後將上面式子中的括號去掉:-(+(a*(bc))+(de))       ---》 -+a*bc+de

但是對於問題3就稍微比較麻煩一點:

問題3:已知前序遍歷(-+a*bc+de)和後序遍歷(abc*+de+-)求中序列遍歷?

思路1:可以根據之前問題3的思路畫出二叉樹的形狀,但是比較麻煩。
思路2:借鑑之前的思路,對於前序遍歷-+a*bc+de 我們在每個運算子前面加上( , 得到  -(+(a*(bc+(de   ,然後再適當的根據(進行配對,加上另一個括號)。
可以得到 -(+(a(b*c)(d+e) ,+(a(b*c) 得到  (a+(b*c)); -((a+(b*c))(d+e) 得到 (a+(b*c))-(d+e);

對於後序遍歷abc*+de+- 我們在每個運算子的前面加上),得到abc)*)+de)+)- ;

題目的答案:


相關文章