二叉树前序遍历和中序遍历推导出后序遍历

860 阅读1分钟

已知二叉树的preorder, inorder得出postorder

leetcode-105 已知前序/后序任意一个和中序遍历,可得出另一种遍历。但如果不知道中序,无解:)下图形象地展示了不同遍历方式对应root节点和left,right子树在数组中位置。(假设遍历得到的结果以数组存储) 我们使用辅助方法: build(self, preorder, preStart, preEnd, inorder, inStart, inEnd)来控制索引。
几个重要变量:
rootVal = preorder[0]/preorder(preStart)
index为在inorder中的位置
leftSize控制中序左右侧长度

image.png

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        return self.build(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1)

    def build(self, preorder, preStart, preEnd,  inorder, inStart, inEnd):
        if preStart > preEnd:   #base case
            return None
        rootValue = preorder[preStart]
        index = 0
        for i in range(inStart,inEnd+1):
            if inorder[i] == rootValue:
                index = i 
                break
        leftLen = index - inStart   #left length
        root = TreeNode(rootValue)
        root.left = self.build(preorder,preStart+1, preStart+leftLen, inorder,inStart,index-1)
        root.right = self.build(preorder,preStart+leftLen+1, preEnd, inorder, index+1, inEnd)
        return root

已知二叉树的postorder, inorder得出preorder

思路几乎同上,注意postorder里最后一个位置是root, 以及注意root.right的postorder范围最右侧是postEnd-1,最后一位是root~