Description
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]
Β
Constraints:
- 1 <= inorder.length <= 3000
- postorder.length == inorder.length
- -3000 <= inorder[i], postorder[i] <= 3000
- inorderand- postorderconsist of unique values.
- Each value of postorderalso appears ininorder.
- inorderis guaranteed to be the inorder traversal of the tree.
- postorderis guaranteed to be the postorder traversal of the tree.
Solution
Python3
# 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)
        mp = {}
 
        for i, x in enumerate(inorder):
            mp[x] = i
        
        def go(left, right):
            if left > right: return None
 
            x = postorder.pop()
            mid = mp[x]
            node = TreeNode(x)
            node.right = go(mid + 1, right)
            node.left = go(left, mid - 1)
            
            return node
        
        return go(0, N - 1)