Skip to content

Build Tree

LeetCode Problem

# https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/

"""
2 Observations
1. 1st value in preorder list : always ROOT. 
    3
   /  \
  9    20
      /  \
     15    7
preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
now preorder = [9,20,15,7] : 1st value always root -> take sublist -> do it again recursively

2. How to know what value goes to left and right side? inorder list.
  Once root identified from preorder, locate the same in inorder : [9,   3,   15,20,7] : index : 1 # mid
    all values <- 3 are on left and -> 3 are on right of tree.
      partition the array in a similar way. [9    20,15,7] now recursively solve : root = 9, and then root = 20, locate value in inorder form parition L and R : solve again.
"""


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, preorder, inorder):
        if not preorder or not inorder:
            return None
        root = TreeNode(preorder[0])  # root will always be 1st val of preorder
        # locate that value in inorder = mid
        mid = inorder.index(preorder[0])
        # partition left and right
        # left : 1 - mid for both PO and IO (why 1? because first element in preorder is root)
        # ruight : mid - end for both PO and IO
        root.left = self.buildTree(preorder[1 : mid + 1], inorder[:mid])
        root.right = self.buildTree(preorder[mid + 1 :], inorder[mid + 1 :])

        return root