Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.
from leetcode_py import TreeNodeclass Solution: """ Construct Binary Tree from Preorder and Inorder Traversal Algorithm Explanation: - Preorder: Root -> Left -> Right (first element is always root) - Inorder: Left -> Root -> Right (root splits left/right subtrees) Example: preorder=[3,9,20,15,7], inorder=[9,3,15,20,7] Step 1: Root = 3 (first in preorder) Find 3 in inorder at index 1 Left subtree: inorder[0:1] = [9] Right subtree: inorder[2:] = [15,20,7] Step 2: Build left subtree with preorder=[9], inorder=[9] Root = 9, no children Step 3: Build right subtree with preorder=[20,15,7], inorder=[15,20,7] Root = 20, left=[15], right=[7] Final tree: 3 / \ 9 20 / \ 15 7 """ # Time: O(n) - hashmap lookup O(1) for each of n nodes # Space: O(n) - hashmap + recursion stack def build_tree(self, preorder: list[int], inorder: list[int]) -> TreeNode | None: if not preorder or not inorder: return None inorder_map = {val: i for i, val in enumerate(inorder)} self.preorder_index = 0 def build(left: int, right: int) -> TreeNode | None: # left, right: boundaries in inorder array for current subtree if left > right: return None root_val = preorder[self.preorder_index] self.preorder_index += 1 root = TreeNode(root_val) mid = inorder_map[root_val] # root position in inorder # Left subtree: inorder[left:mid-1] root.left = build(left, mid - 1) # Right subtree: inorder[mid+1:right] root.right = build(mid + 1, right) return root return build(0, len(inorder) - 1)