資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷
二叉樹的遍歷規則主要有三種:前序遍歷,中序遍歷,後序遍歷。它們是根據訪問根節點的先後順序來劃分的。
前序遍歷:
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)+)- ;
題目的答案:
相關文章
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 二叉樹--後序遍歷二叉樹
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- L2_006樹的遍歷(後序+中序->前序/層序)
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode-105-從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- PAT 1043 Is It a Binary Search Tree (25分) 由前序遍歷得到二叉搜尋樹的後序遍歷
- 程式碼隨想錄演算法訓練營day14 | leetcode 144. 二叉樹的前序遍歷、145. 二叉樹的後序遍歷、94. 二叉樹的中序遍歷演算法LeetCode二叉樹
- 二叉樹的層序遍歷二叉樹
- ast 後序遍歷AST
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 二叉樹遍歷順序與方法小結二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹 | PytLeetCode二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 劍指offer:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 二叉樹的後序遍歷post order演算法二叉樹演算法
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- Morris中序遍歷
- 二叉搜尋樹的後序遍歷序列
- 中序線索二叉樹的建立與遍歷二叉樹
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹