def buildTree(preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
def helper(preorder, inorder):
if len(inorder) < 1:
return(None)
current_node = preorder.pop(0) # take current preorder value (preorder is pass by reference and hence pop in one call will impact other calls)
current_node_idx = inorder.index(current_node) # take the index to split inorder values for left and right subtrees
# With preorder traversal first call left subtree and then right subtree
left_subtree = helper(preorder, inorder[:current_node_idx])
right_subtree = helper(preorder, inorder[current_node_idx+1:])
return(TreeNode(current_node, left_subtree, right_subtree))
return(helper(preorder, inorder))