Optimal solution
# 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]) -> TreeNode:
"""
tc O(N)
sc O(N)
"""
# mapping val and idx of inorder
d = {}
for i,v in enumerate(inorder):
d[v] = i
def helper(low,high):
if low > high:
return None
root = TreeNode(postorder.pop()) # last element in post order is parent node of Binary Tree
mid_idx = d[root.val]
root.right = helper(mid_idx+1,high)
root.left = helper(low,mid_idx-1)
return root
return helper(0,len(inorder)-1)
# 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]) -> TreeNode:
ni = len(inorder)
np = len(postorder)
if np != ni:
return None
def helper(inorder,postorder,inL,inH,poL,poH):
# termination condition:
if inL > inH or poL > poH:
return None
# build root
root = TreeNode(postorder[poH])
# find left Tree in inorder
inorder_root = inL
for i in range(inL,inH+1):
# find end of left subtree
if inorder[i] == root.val:
inorder_root = i
break
LtreeLen = inorder_root - inL - 1
root.left = helper(inorder,postorder,inL,inorder_root-1,poL,poL+LtreeLen)
root.right = helper(inorder,postorder,inorder_root+1,inH,poL+LtreeLen+1,poH-1)
return root
return helper(inorder,postorder,0,ni-1,0,ni-1)