Röd svart träd rotationer och färg Flips

Thamindu Dilshan Jayawickrama
Thamindu Dilshan Jayawickrama

följ

Jul 11, 2020 · 6 min läs

ett typiskt sökträd som binärt sökträd (BST) kan stöta på en höjd av o(n) vilket kan resultera i värsta fall tidskomplexitet för O(n) för grundläggande operationer som sökning, insättning, radering etc. Detta beror helt på ordningen på de objekt som sätts in i BST. Men det finns vissa situationer där vi inte har hela objektet inställt när vi börjar bygga trädet. Det är där de balanserade sökträden spelar in. I ett balanserat sökträd garanteras en höjd av O (log n) vid implementering av en dynamisk uppsättning n-objekt. Röd-svarta träd, AVL träd, 2-3 träd och B-träd är några av exemplen för balanserade sökträd implementeringar. Den här artikeln handlar om trädmodifieringsoperationer som är involverade i röd-svarta träd.

ett rött-svart träd (RB-träd) är ett självbalanserande binärt sökträd där varje nod följer en uppsättning regler. Varje nod i ett RB-träd har ett extra attribut; färgen, som antingen kan vara röd eller svart. I en typisk RB-trädimplementering kommer det att finnas en uppsättning sentinel-noder för att flagga att en bladnod nås. Dessa noder kallas nollor (eller NILs) och betraktas som bladnoder i den här artikeln. Nedan följer uppsättningen regler eller egenskaper som varje nod ska följa.

  1. varje nod är antingen röd eller svart.

2. Roten och bladen är svarta.

3. Om en nod är röd, är dess förälder svart.

4. Alla enkla vägar från vilken nod som helst till ett efterkommande blad har samma antal svarta noder (svarthöjd).

höjden på ett RB-träd förblir vid o(log n) efter varje trädmodifieringsoperation som resulterade i en garanterad övre gräns för O(log n) för dessa operationer. Operationerna Infoga och ta bort orsaka ändringar i RB-trädet. Efter varje trädmodifieringsoperation kommer trädet att vara självbalanserat genom färgförändringar och rotationer. Innan vi går in i dessa operationer bör vi vara bekanta med följande notation.

en rotation är en speciell operation avsedd för självbalanserande binära sökträd som kan utföras i o(1) tid. En intressant egenskap på rotationer är att den bevarar inorderkorsningen av nycklarna (beställning av nycklarna).

beslutet att utföra en rotation eller en färgförändring baseras på moster av den betraktade noden (den aktuella noden). Om noden har en svart Moster, gör vi en rotation. Om noden har en röd Moster, gör vi en färgflip. Efter att ha utfört en rotation, bör vi Färg fixa trädet. Efter att ha utfört dessa operationer ska trädet avslutas som nedan.

om den aktuella noden är det vänstra barnet till sin morförälders vänstra barn, roterar vi morföräldern runt föräldern. Om den aktuella noden är rätt barn till sin morförälders högra barn, lämnade vi rotera morföräldern runt föräldern. Om den aktuella noden är rätt barn till sin morförälders vänstra barn, utför vi en vänster-höger rotation där vi roterar morföräldern och barnet runt föräldern. Om den aktuella noden är det vänstra barnet till sin morförälders högra barn, utför vi en höger-vänster rotation där vi roterar morföräldern och barnet runt föräldern. Alla rotationer kan sammanfattas enligt nedanstående diagram.

ett viktigt faktum att komma ihåg är att efter att ha utfört någon trädmodifieringsoperation bör du validera trädet mot uppsättningen regler för att ta reda på om några överträdelser finns där. Om en överträdelse finns (ex: root är röd) bör du korrigera den. Låt oss nu konstruera ett enkelt RB-träd genom att infoga under uppsättning nycklar. Observera att för enkelhetens skull ignoreras bladnoder (NULL) i nedanstående diagram.

5, 8, 1, 10, 9, 15, 20

vi ska infoga varje tangent som en röd nod. Därför sätter vi in 5 som en röd nod och färgar den omedelbart tillbaka till svart eftersom det är rotnoden. Sedan sätter vi in 8 som nod 5: s högra barn. vi följer den grundläggande BST-egenskapen när du sätter in nycklar. Att sätta in 1 är detsamma som att sätta in 8.

därefter ska vi infoga 10 som 8s rätt barn. Vi sätter in den som en röd nod och kontrollerar för överträdelser. Både 8 och 10 är röda noder och det bryter mot 3: e egenskapen. Vi borde kolla efter moster och den är röd. Så vi utför en färgflip. Efter färgflipen kan vi se att rotnoden är röd och den bryter mot 2: a egenskapen. Så vi fixar det genom att ändra färgen på rotnoden.

därefter ska vi sätta in nyckeln 9. Efter införandet kan vi se att både 9 och 10 noder är röda och det bryter mot 2: a egenskapen. Vi kontrollerar för moster och eftersom det är svart (noll är svart), utför vi en höger-vänster rotation (överträdelse är i höger barns vänstra subtree). Efter rotationen borde vi göra en färgfix.

låt oss nu sätta in nyckeln 15. Efter införandet kan vi se att två på varandra följande röda noder finns där och moster av 15 är en röd nod. Så vi borde göra en färgflip. Därefter kontrollerar vi för eventuella överträdelser och kan ta reda på att inga överträdelser finns där.

låt oss nu sätta in nyckeln 20 till trädet. Efter införandet kan vi se att mostern är svart och därför bör vi utföra en vänsterrotation (överträdelse är i rätt barns rätt subtree). Efter rotationen borde vi göra en färgfix.

i den här artikeln tittade vi på ett visst självbalanserande binärt sökträd; Röd-svart träd. De garanteras ha en höjd av O(log n) och har därför en värsta tidskomplexitet av O (log n) för grundläggande trädoperationer. Röd-svarta träd är särskilt användbara i många datavetenskapliga applikationer. C++ Standard Template Library (STL) har satt, multiset, karta och multimap baserat på RB-träd. TreeMap i Java-språk är också en RB-Trädbaserad NavigableMap-implementering.

Lämna ett svar

Din e-postadress kommer inte publiceras.