I det föregående inlägget diskuterade vi introduktionen till Red-Black Trees. I det här inlägget diskuteras insättning. I AVL-trädinsättning använde vi rotation som ett verktyg för att göra balansering efter insättning. I Red-Black Tree använder vi två verktyg för att göra balanseringen.
- Rekolorering
- Rotation
Rekolorering är ändringen av nodens färg, dvs. om den är röd ändras den till svart och vice versa. Det bör noteras att färgen på NULL-noden alltid är svart. Dessutom försöker vi alltid först med omfärgning. Om omfärgning inte fungerar, försöker vi sedan med rotation. Nedan följer en detaljerad algoritm. Algoritmerna har huvudsakligen två fall beroende på fargen på onkeln. Om farbrodern är röd gör vi en omfärgning. Om farbrodern är svart gör vi rotationer och/eller omfärgning.
Den representation vi kommer att arbeta med är:
Denna representation är baserad på X
Logik:
Först måste du infoga noden på samma sätt som i ett binärt träd och tilldela den en röd färg. Om noden är en rotnod ändrar du färgen till svart, men om den inte är en rotnod kontrollerar du färgen på den överordnade noden. Om dess färg är svart ska du inte ändra färgen, men om den inte är det, dvs. om den är röd, ska du kontrollera färgen på nodens farbror. Om nodens farbror är röd ändrar du färgen på nodens förälder och farbror till svart och på farfars farbror till röd färg och upprepar samma process för honom (dvs. farfar).
Men om nodens farbror har svart färg finns det fyra möjliga fall:
- Vänster vänster fall (LL rotation):
- Vänster höger fall (LR rotation):
- Right Right Case (RR rotation):
- Right Left Case (RL rotation):
Nu, efter dessa rotationer, om nodernas färger inte stämmer överens, färga om dem.
Algoritm:
Låt x vara den nyinsatta noden.
- Uppför standard BST-insättning och gör färgen på de nyinsatta noderna till RÖD.
- Om x är roten, ändra färgen på x till SVART (Svart höjd på hela trädet ökar med 1).
- Gör följande om färgen på x:s överordnade noder inte är SVART och x inte är roten.
a) Om x:s farbror är RÖD (Farföräldern måste ha varit svart från egenskap 4)
(i) Ändra färgen på förälder och farbror till SVART.
(ii) Färgen på en mor- eller farförälder som RÖD.
(iii) Ändra x = x:s mor- eller farförälder, upprepa steg 2 och 3 för nya x.b) Om x:s farbror är SVART kan det finnas fyra konfigurationer för x, xs förälder (p) och xs mor- och farförälder (g) (Detta liknar AVL Tree)
(i) Left Left Case (p är vänster barn till g och x är vänster barn till p)
(ii) Left Right Case (p är vänster barn till g och x är höger barn till p)
(iii) Right Right Case (spegel av fall i)
(iv) Right Left Case (spegel av fall ii)
Exempel: Skapa ett rött-svart träd med elementen 3, 21, 32 och 17 i ett tomt träd.
Lösning:
När det första elementet sätts in sätts det in som en rotnod och eftersom rotnoden har svart färg får den färgen svart.
Det nya elementet sätts alltid in med röd färg och eftersom 21 > 3 blir det en del av det högra underträdet till rotnoden.
När vi nu infogar 32 ser vi att det finns ett rött far-barn-par som bryter mot regeln om det röda-svarta trädet så vi måste rotera det. Dessutom ser vi villkoren för RR-rotationen (som innebär att rotnodens nollnod betraktas som svart), så efter rotationen kan rotnoden inte vara röd, så vi måste göra en ny färgning av trädet, vilket resulterar i det träd som visas ovan.
Nu när vi infogar det nya elementet visas föräldra- och barnnoden med röd färg igen och här måste vi färga om dem. Vi ser att både föräldra- och farbror-noden har röd färg så vi ändrar helt enkelt deras färg till svart och ändrar farfars färg till rött. Eftersom farfadern är rotnoden ändrar vi återigen dess färg till svart, vilket resulterar i trädet som visas ovan.
Den slutliga trädstrukturen:
Det slutliga trädet ser ut så här
Vänligen hänvisas till C Program for Red Black Tree Insertion för fullständig implementering av ovanstående algoritm.
Red-Black Tree | Set 3 (Delete)