3.4.8 · Coding › Trees
Intuition Ek sentence mein poori baat
Ek Red-Black tree ek Binary Search Tree hai jo har node ko red ya black paint karta hai aur kuch coloring rules follow karta hai taaki koi bhi root-to-leaf path kabhi bhi kisi doosre path se zyada double na ho . Yeh ek guarantee height O ( log n ) rakhti hai, isliye search/insert/delete fast rehte hain — AVL tree ki strict, mehngayi-wali perfect balancing ke bina .
Intuition Jo problem hum solve kar rahe hain
Ek plain BST ek linked list mein degrade ho sakta hai (insert karo 1 , 2 , 3 , 4 , 5 → height n ki ek stick ban jaati hai). Tab search O ( n ) ho jaata hai. Hum chahte hain ek aisa BST jo insertion/deletion ke dauran self-correct kare taaki height O ( log n ) rahe.
AVL trees isko subtree heights ko 1 ke andar rakh ke fix karte hain — bahut tight hai, lekin bahut zyada rotate karte hain. Red-Black trees balance relax karte hain: woh 2× path-length spread allow karte hain. Iska faida hai fewer rotations (har insert/delete mein zyada se zyada constant), isliye C++ std::map, Java TreeMap, aur Linux kernel inhe use karte hain.
Definition Red-Black properties
Har node ya to red hai ya black .
Root hamesha black hota hai.
Har leaf (special NIL sentinel) black hota hai.
Kisi red node ka red child nahi hota (row mein do reds nahi → "no red-red").
Kisi node se uske descendant NIL leaves tak har path mein utne hi black nodes hote hain. Yeh count black-height kehlata hai, bh ( x ) .
Intuition Yeh specific rules balance kyun force karte hain
Property 5 kehti hai sabhi paths mein utne hi black nodes hote hain. Property 4 kehti hai reds cluster nahi ho sakte — kisi bhi do reds ke beech ek black hoga. Toh kisi bhi path mein, zyada se zyada aadhe nodes red ho sakte hain. Isliye sabse lamba path (alternating red/black) sabse chote path (sab black) se zyada se zyada double ho sakta hai. Double bhi O ( log n ) hi hai.
structural fix)
Ek rotation teen nodes ko rearrange karta hai taaki height change ho sake jabki BST order preserve ho . x par ek left rotation uske right child y ko upar kheenchta hai:
x y
/ \ / \
a y ==> x c
/ \ / \
b c a b
b , y ke left se x ke right par move ho jaata hai. Order valid rehti hai kyunki a < x < b < y < c pehle bhi tha aur baad mein bhi. Rotation O ( 1 ) pointer surgery hai.
Definition Recoloring (ek
color fix)
Node colors ko flip karna taaki red-red violation fix ho sake bina nodes move kiye. Tab use hota hai jab naye node ka uncle red ho: hum parent & uncle ko black karke "blackness" neeche push karte hain aur grandparent ko red karke upar re-check karte hain.
Intuition KAB kaunsa use karein (insertion mein)
Naya inserted node red color kiya jaata hai (taaki woh property 5 violate na kare; woh sirf property 4 violate kar sakta hai — red-red). Red-red fix karne ke liye:
Uncle RED hai → recolor karo (sasta, koi rotation nahi). Problem ko tree ke upar push karo.
Uncle BLACK hai (ya NIL) → rotate + recolor karo taaki locally restructure ho. Yeh immediately terminate ho jaata hai.
Worked example Us tree mein insert karo jahan uncle red hai
Start: g = 10 (black), p = 5 (red, left child), u = 15 (red, right child). 3 insert karo.
Step 1: 3 < 10 < left jaao; 3 < 5 left jaao → 3 ko 5 ka red left-child ki jagah rakho.
Yeh step kyun? Pehle BST insert, default mein red color karo.
Step 2: Ab 5 (red) ka red child 3 hai → red-red violation. Uncle u = 15 dekho: red .
Uncle kyun dekhte hain? Uncle ka color decide karta hai recolor vs rotate.
Step 3: Case 1 → recolor: p = 5 →black, u = 15 →black, g = 10 →red. z = 10 set karo.
Kyun? Koi rotation nahi chahiye; black counts balanced rehte hain, problem upar float karti hai.
Step 4: z = 10 ab root hai → property 2 kehti hai root black hona chahiye → 10 →black recolor karo. Ho gaya.
Kyun? Root ko black force karna hamesha safe hai (har path mein equally 1 black add karta hai).
Worked example Ek empty RB tree mein
1 , 2 , 3 insert karo
1 insert karo: root, black color kiya.
2 insert karo: red, 1 ka right child. Koi red-red nahi (parent black hai). OK.
3 insert karo: red, 2 ka right child. Ab 2 (red) ka red child 3 hai → red-red. 3 ka uncle = 1 ka left child = NIL → black . Line 1 –2 –3 seedhi hai (sab right) → Case 3 .
Step 1: p = 2 →black, g = 1 →red recolor karo.
Kyun? 2 ko new black subtree root ki tarah lift karne ki taiyaari.
Step 2: g = 1 par left-rotate karo.
Kyun? 2 ko upar laata hai taaki woh 1 aur 3 dono ka parent ban sake.
Result: 2 (black) children 1 (red), 3 (red) ke saath. Balanced, height 2, koi violations nahi.
Kyun correct hai: Dono paths mein exactly ek black node (2 ) hai → property 5 hold karta hai; koi red-red nahi → property 4 hold karta hai.
Common mistake "Naye node ko safe rehne ke liye black insert karo."
Kyun sahi lagta hai: black matlab 'balanced', toh black zaroori cautious choice lagti hai.
Kyun galat hai: ek naya black node sirf ek path ka black-count 1 se badhata hai, turant property 5 (equal black-heights) break karta hai — sabse mushkil property repair karna.
Fix: hamesha red insert karo. Red sirf aasaan property 4 (red-red) break kar sakta hai, jo local recolor/rotate se fix ho jaati hai.
Common mistake "Red-red hone par hamesha rotate karo."
Kyun sahi lagta hai: rotations visibly rebalance karte hain, toh woh universal cure lagte hain.
Fix: agar uncle red hai , toh pure recoloring kaafi hai — koi rotation nahi. Rotations sirf black uncle ke liye hain. Red uncle ke saath rotate karna over-correct karega aur kaam waste karega.
Common mistake "Red-Black trees AVL ki tarah perfectly balanced hain."
Kyun sahi lagta hai: dono 'balanced BSTs' hain.
Fix: RB sirf guarantee karta hai ki longest path ≤ 2 × shortest. AVL tighter hai (heights ≤ 1 differ karte hain). RB thodi height trade karta hai fewer rotations ke liye update par.
NIL leaves ko black nodes bhool jaana.
Kyun sahi lagta hai: woh 'kuch nahi' lagte hain.
Fix: NIL sentinels real black leaves hain black-height count karne ke liye. Property 5 NIL tak paths ke baare mein hai, data nodes tak nahi.
Recall Feynman: ek 12-saal ke bacche ko explain karo
Socho ek family tree jahan har insaan red ya black shirt pehanta hai. Rule: red-shirt wala insaan apne red-shirt wale bachche nahi rakh sakta (do reds touch nahi ho sakte). Aur chahe tum kisi bhi path se neeche chalo, tumhe utni hi black shirts pass karni padti hain. Yeh rules secretly tree ko bahut lamba aur ek taraf jhukne se rokti hain. Jab ek naya baccha join karta hai (hamesha red shirt mein) aur kisi doosre red shirt wale ke paas khada hota hai, toh family ek quick fix karti hai: ya toh sab shirts swap karte hain (recoloring) ya kuch log seats swap karte hain (rotation) taaki rules hold ho sakein. Woh tidying tree ko chota rakhti hai, isliye kisi ko bhi dhundhna super fast rehta hai.
Mnemonic Rules & fixes yaad karo
"Roots Are Loyal, No Red Rebels, Black Balance."
R oots A re black, L eaves (NIL) black hain, No R ed–R ed, B lack-count B alanced.
Fixup decision: "Red uncle? Recolor. Black uncle? Bend (rotate)."
Naya RB node kis color ka hota hai, aur kyun? Red — yeh sirf property 4 (red-red) violate kar sakta hai, jo fix karna aasaan hai, aur kabhi property-5 black-height balance nahi tootne deta.
Ek Red-Black tree ki property 4 batao. Kisi red node ka red child nahi hota (do reds adjacent nahi hote).
Ek Red-Black tree ki property 5 batao. Har root-to-NIL path mein same number of black nodes hote hain (equal black-height).
RB height O ( log n ) kyun hai? Black-height bh wale ek subtree mein ≥ 2 bh − 1 nodes hote hain, aur bh ≥ h /2 hai, jo deta hai h ≤ 2 log 2 ( n + 1 ) .
Insert fixup ke dauran rotate ki jagah recolor kab karte ho? Jab uncle RED ho — parent & uncle black karo, grandparent red karo, phir upar move karo.
Insert fixup ke dauran rotate kab karte ho? Jab uncle BLACK ho (ya NIL) — locally rotate + recolor karo; yeh terminate ho jaata hai.
Left rotation kya preserve karta hai? BST in-order ordering (a < x < b < y < c pehle aur baad mein), jabki O ( 1 ) mein structure/height change karta hai.
Fixup ke end mein root ko black kyun recolor karna padta hai? Recoloring loop ka last step hai; root ko black force karna har path mein equally ek black add karta hai, property 2 restore karta hai bina property 5 toode.
RB tree vs AVL tree balance guarantee? RB: longest path ≤ 2 × shortest (looser, fewer rotations). AVL: subtree heights ≤ 1 differ karte hain (tighter, more rotations).
Kya NIL leaves black nodes mane jaate hain? Haan — NIL sentinels real black leaves hain jo black-height count karne ke liye use hoti hain.
Insertion per rotations ki maximum kitni hoti hai? Zyada se zyada 2 (constant) — yeh ek key reason hai ki RB updates saste hain.
Binary Search Tree — RB ek BST hai extra coloring invariants ke saath.
AVL Tree — tighter balance, more rotations; contrast trade-off.
Tree Rotations — shared O ( 1 ) restructuring primitive.
Big-O Analysis — O ( log n ) height proof.
2-3-4 Tree — RB trees 2-3-4 B-trees ki isometry hain (har black node + uske red children = ek B-tree node).
std::map / TreeMap internals — real-world implementations.
preserves BST order, restores
Same black-height per path
std::map, TreeMap, Linux kernel