Given two integer arrays inorder
and postorder
where inorder
is the inorder traversal of a binary tree and postorder
is the postorder traversal of the same tree, construct and return the binary tree.
Example 1:
Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] Output: [3,9,20,null,null,15,7]
Example 2:
Input: inorder = [-1], postorder = [-1] Output: [-1]
这题跟Leetcode 105相似,只是把前序遍历改成了后序遍历,解法差不多。搞定这两题对于二叉树的遍历问题基本上就差不多了。
解题思路:
后序遍历数组的最后一个数永远是二叉树的根节点,从开头到倒数第二个数的前半部分为左子树,右半部分为右子树。关键是从哪里把数组分成左右两部分?这就要借助中序遍历数组的特性,对于中序遍历数组,如果已经知道根节点的值,那就可以在中序遍历数组里找到根节点的位置,根节点的左边部分为左子树,右边部分为右子树。由此就可以确定左右子树的长度,再根据左右子树的长度就可以确定后序遍历数组里对应的左右子树部分。把数组分成根节点,左子树和右子树部分之后,就可以通过递归调用进一步处理左子树和右子树数组,直到数组为空返回空节点结束。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
n = len(inorder)
value2index = {}
for i in range(n) :
value2index[inorder[i]] = i
def helper(l1, r1, l2, r2) :
if l2 > r2 :
return None
root = TreeNode(postorder[r2])
index = value2index[postorder[r2]]
leftLen = index - l1
root.left = helper(l1, index - 1, l2, l2 + leftLen - 1)
root.right = helper(index + 1, r1, l2 + leftLen, r2 -1)
return root
return helper(0, n - 1 , 0, n - 1)