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!
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.
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
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[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
[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
- Sirf Preorder + Postorder use karna: Ye combination uniquely tree construct nahi kar sakta. Hamesha Inorder chahiye. Multiple trees possible hain bina inorder ke.
- Index calculation galat karna: Inorder mein root ka index nikalte waqt galti se wrong subtree sizes aa sakte hain. Carefully split karo aur verify karo.
- Base case bhoolna: Recursion mein agar
if not preorder: return Nonenahi likha toh infinite recursion hoga. Empty array = no node. - Array slicing se performance: Har baar naya array banana O(n) space leta hai. Optimization ke liye indices pass karo (start, end) instead of array slicing.
- Postorder mein root identification: Postorder mein root
lastelement hai,firstnahi. Preorder mein rootfirstelement hai. Dono confuse mat karo.
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!