刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;
假期繼續刷題,也沒有別的什麼事情可以幹。
這個題是給出中序和後序遍歷佇列,構造對應二叉樹;題目很簡單,如下圖,給出兩個遍歷佇列,構成二叉樹,這裡假定沒有重複點。
想了好幾天,真是慚愧,因為一直想一次遍歷就完成構造,最後發現不行;然後就硬搞出一個多重迴圈的遍歷方法,雖然可行,但是提交後提示耗時超過限制。最後還是用遞迴實現的。
其實原理很簡單,對於後續遍歷佇列,最後一個值就是整個二叉樹的根節點;而這個根節點去掉後,可以把二叉樹分成左右兩個樹,在中序佇列中,按照這個根節點來拆分出可以得到左右佇列,分佈對應左邊樹和右邊樹的所有點。而且其實後序佇列也是按照左右樹節點劃分的,只要知道左右樹的節點數量,來劃分就可以了,這個可以從中序佇列劃分結果獲得。反覆同理,再劃分出來左右樹繼續劃分,可以得到葉子節點,或者空序列;這樣就完成樹的構成。
程式碼如下:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode: if inorder == []: return None else: if len(inorder) == 1: return TreeNode(inorder[0]) else: RootVal = postorder[-1] currentNode = TreeNode(RootVal) inorderLeft = inorder[:inorder.index(RootVal)] inorderRight = inorder[inorder.index(RootVal)+1:] postorder.pop() postorderLeft = postorder[:len(inorderLeft)] postorderRight = postorder[-len(inorderRight):] currentNode.left = self.buildTree(inorderLeft,postorderLeft) currentNode.right = self.buildTree(inorderRight,postorderRight) return currentNode
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2674510/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 刷題系列 - 給出前序和後序遍歷佇列,構造對應二叉樹佇列二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- 二叉樹中序和後序遍歷表示式二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 388,先序遍歷構造二叉樹二叉樹
- 889. 根據前序和後序遍歷構造二叉樹二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- 二叉樹--後序遍歷二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- Leetcode 889. 根據前序和後序遍歷構造二叉樹LeetCode二叉樹
- 遞迴和迭代實現二叉樹先序、中序、後序和層序遍歷遞迴二叉樹
- 刷題系列 - Python用非遞迴實現二叉樹中序遍歷Python遞迴二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 【模板題】- 145. 二叉樹的後序遍歷二叉樹
- [資料結構] 根據前中後序遍歷中的兩種構造二叉樹資料結構二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode-105-從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 144. 二叉樹的遍歷「前序、中序、後序」 Golang實現二叉樹Golang
- 先序、中序、後序序列的二叉樹構造演算法二叉樹演算法
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 力扣工作周刷題 - 94. 二叉樹的中序遍歷力扣二叉樹
- 【模板題】- 94. 二叉樹的中序遍歷二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹 | PytLeetCode二叉樹
- 層序遍歷樹的節點,佇列實現佇列