Lesson 5 � Intermediate

Tree Construction from Traversals

Kya aapko pata hai ki sirf 2 traversal arrays se pura tree rebuild kiya ja sakta hai✓ Inorder + Preorder ya Inorder + Postorder combinations se tree construct karna interview mein bahut aata hai. Chalo samajhte hain kaise!

? 28 min✓ Intermediate✓ Binary Tree traversals, Recursion

Construction ka Concept

WHAT

Tree construction ka idea simple hai � ek traversal se root dhundho, doosre se left aur right subtrees separate karo, aur recursively dono subtrees build karo. Preorder mein pehla element root hota hai, Postorder mein last element root hota hai.

WHEN

Serialization/deserialization mein, tree ko store karna ho ya network pe bhejna ho, compiler design mein expression trees banane ke liye, aur interview mein bahut common problem hai.

WHERE

LeetCode 105 (Inorder+Preorder), 106 (Inorder+Postorder), 889 (Preorder+Postorder) � sab popular problems hain. ye recursion + divide-and-conquer ka perfect example hai.

Key Rule: Inorder + any ek aur traversal se tree uniquely construct ho sakta hai. sirf Preorder + Postorder se uniquely construct nahi hota (multiple trees possible hain). Isliye Inorder hamesha chahiye!

Inorder + Preorder se Construction

Preorder ka pehla element hamesha root hota hai. Inorder mein root ke left mein left subtree aur root ke right mein right subtree hota hai:

# Example:
# Preorder: [1, 2, 4, 5, 3, 6]
# Inorder: [4, 2, 5, 1, 6, 3]

# Step 1: Preorder ka pehla element = root = 1
# Step 2: Inorder mein 1 dhundho ✓ index 3
# Left subtree inorder: [4, 2, 5] (index 0-2)
# Right subtree inorder: [6, 3] (index 4-5)
# Step 3: Preorder mein next elements split karo
# Left subtree preorder: [2, 4, 5] (1 ke baad 3 elements)
# Right subtree preorder: [3, 6] (baaki elements)
# Step 4: Recursively dono subtrees build karo
def buildTree(preorder, inorder):
 if not preorder:
 return None
 
 root = Node(preorder[0])
 mid = inorder.index(root.val)
 
 root.left = buildTree(preorder[1:mid+1], inorder[:mid])
 root.right = buildTree(preorder[mid+1:], inorder[mid+1:])
 
 return root

# Time: O(n�) � index search O(n) hai, n nodes
# Space: O(n) � recursion stack + new arrays
Optimization: Index search ko O(1) mein karne ke liye hashmap use karo jo inorder values ko indices se map kare. Isse time complexity O(n) ho jaati hai. Also, array slicing ki jagah indices pass karo toh space bhi optimize hoga.

Inorder + Postorder se Construction

Postorder mein last element root hota hai. Baaki logic same hai � root dhundho, inorder se left/right split karo, recursively build karo:

# Example:
# Postorder: [4, 5, 2, 6, 3, 1]
# Inorder: [4, 2, 5, 1, 6, 3]

# Step 1: Postorder ka last element = root = 1
# Step 2: Inorder mein 1 dhundho ✓ index 3
# Left subtree inorder: [4, 2, 5]
# Right subtree inorder: [6, 3]
# Step 3: Postorder mein left subtree ke 3 elements pehle aate hain
# Left subtree postorder: [4, 5, 2]
# Right subtree postorder: [6, 3]
# Step 4: Recursively build karo

def buildTreePost(postorder, inorder):
 if not postorder:
 return None
 
 root = Node(postorder[-1])
 mid = inorder.index(root.val)
 
 root.left = buildTreePost(postorder[:mid], inorder[:mid])
 root.right = buildTreePost(postorder[mid:-1], inorder[mid+1:])
 
 return root
Preorder vs Postorder Difference: Preorder mein root pehle aata hai, isliye preorder[0] root hai aur left subtree preorder[1:mid+1] mein hai. Postorder mein root last mein aata hai, isliye postorder[-1] root hai aur left subtree postorder[:mid] mein hai.

Level Order Input se Construction

Level order traversal (BFS order) se bhi tree construct ho sakta hai. Ye thoda different hai � queue use karte hain:

# Level order: [1, 2, 3, 4, 5, 6]
# Tree:
# 1
# / \
# 2 3
# / \ / \
# 4 5 6

from collections import deque

def buildTreeLevel(levelorder):
 if not levelorder:
 return None
 
 root = Node(levelorder[0])
 queue = deque([root])
 i = 1
 
 while queue and i < len(levelorder):
 node = queue.popleft()
 
 if i < len(levelorder):
 node.left = Node(levelorder[i])
 queue.append(node.left)
 i += 1
 
 if i < len(levelorder):
 node.right = Node(levelorder[i])
 queue.append(node.right)
 i += 1
 
 return root
Level Order Note: Level order se tree sirf complete binary tree ke liye uniquely construct hota hai. Agar tree mein None nodes hain (missing nodes), toh level order mein unhe represent karna padta hai (jaise [1, 2, 3, None, 5]). Tab bhi construction possible hai.

Try it: code khud likho

Exercise

Question: Preorder [1, 2, 4, 5, 3, 6] aur Inorder [4, 2, 5, 1, 6, 3] se tree banao. Root ka value kya hoga✓ Sirf number daalo.

Question: Same traversals mein left subtree ke inorder array kya hoga✓ Answer mein comma-separated numbers daalo.

Common mistakes

Lesson complete!

Congratulations! Trees & BST module complete ho gaya. Ab tumhe binary trees, BST, traversals, height, LCA, aur construction � sab aa gaya hai. Ab Graphs module mein jaake tree concepts ko graphs pe apply karo!