240 likes | 626 Vues
Rot-Schwarz-Baum. Ein Rot-Schwarz-Baum ist ein binärer Suchbaum mit den folgenden zusätzlichen Eigenschaften: 1.Jeder Knoten ist entweder rot oder schwarz. 2.Der Wurzelknoten ist schwarz. 3.Jedes Blatt (NULL Knoten) ist schwarz.
E N D
Rot-Schwarz-Baum • Ein Rot-Schwarz-Baum ist ein binärer Suchbaum mit den folgenden zusätzlichen Eigenschaften: • 1.Jeder Knoten ist entweder rot oder schwarz. • 2.Der Wurzelknoten ist schwarz. • 3.Jedes Blatt (NULL Knoten) ist schwarz. • 4.Ist ein Knoten rot, dann sind seine beiden Kinder schwarz. • 5.Jeder Pfad von einem gegebenen Knoten zu seinen Blattknoten enthält die gleiche Anzahl schwarzer Knoten
Rot-Schwarz-Baum Durch diese Bedingungen wird die wichtigste Eigenschaft von Rot-Schwarz-Bäumen sichergestellt: Die Anzahl der Knoten auf dem längsten Pfad von der Wurzel zu einem Blatt ist nie mehr als doppelt so hoch wie die Anzahl der Knoten des kürzesten Pfades von der Wurzel zu einem Blatt. Hierdurch ist ein Rot-Schwarz-Baum immer annähernd balanciert, was für die Operationen SEARCH, INSERT und DELETE wichtig ist, da diese Laufzeitkosten proportional zur Höhe des Baumes haben.
Rot-Schwarz-Baum 26 17 41 14 21 47 30 10 16 10 19 23 28 38 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 12 7 20 15 39 35 3 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
Rot-Schwarz-Baum Lokale Operation: Rotation Um nach Einfügungen und Löschungen im Baum die Eigenschaften des Rot-Schwarz-Baums wiederherzustellen, müssen gewisse Knoten um- gefärbt und einige Zeiger geändert werden. Diese sogenannten Rotationen sind lokale Änderungen der Baumstruktur, die die Erhaltung der Ordnungseigenschaft garantieren.
Rot-Schwarz-Baum Right-Rotate(T,Q): Q mit rechtem Teilbaum wird zum rechten Teilbaum von P. Der ursprüngliche rechte Teilbaum B von P wird zum linken Teilbaum von Q. Der rechte Teilbaum C von Q bleibt an seiner Position. Left-Rotate(T,S): P mit linkem Teilbaum wird zum linken Teilbaum von Q. Der ursprüngliche linke Teilbaum B von Q wird zum rechten Teilbaum von P. Der rechte Teilbaum C von Q bleibt an seiner Position.
Rot-Schwarz-Baum Pseudocode: Linksrotation LEFT-ROTATE(T, x) 1 y ← right[x] ▹ Set y. 2 right[x] ← left[y] ▹ Turn y's left subtree into x's right subtree. 3 p[left[y]] ← x 4 p[y] ← p[x] ▹ Link x's parent to y. 5 if p[x] = nil[T] 6 then root[T] ← y 7 else if x = left[p[x]] 8 then left[p[x]] ← y 9 else right[p[x]] ← y 10 left[y] ← x ▹ Put x on y's left. 11 p[x] ← y
Rot-Schwarz-Baum Beispiel: 10 5 14 x 3 7 12 17 y Left-Rotate(T,x) 16 18 10 17 y 5 x 14 18 3 7 12 16
Rot-Schwarz-Baum RB-INSERT(T, z) 1 y ← nil[T] 2 x ← root[T] 3 while x ≠ nil[T] 4 do y ← x 5 if key[z] < key[x] 6 then x ← left[x] 7 else x ← right[x] 8 p[z] ← y 9 if y = nil[T] 10 then root[T] ← z 11 else if key[z] < key[y] 12 then left[y] ← z 13 else right[y] ← z 14 left[z] ← nil[T] 15 right[z] ← nil[T] 16 color[z] ← RED 17 RB-INSERT-FIXUP(T, z) Bis Zeile 13 entspricht der Algorithmus dem Einfügen in einen herkömmlichen Binären Suchbaum.
Rot-Schwarz-Baum RB-INSERT-FIXUP(T, z) 1 while color[p[z]] = RED 2 do if p[z] = left[p[p[z]]] 3 then y ← right[p[p[z]]] 4 if color[y] = RED 5 then color[p[z]] ← BLACK ▹ Fall1 6 color[y] ← BLACK ▹ Fall 1 7 color[p[p[z]]] ← RED ▹ Fall 1 8 z ← p[p[z]] ▹ Fall 1 9 else if z = right[p[z]] 10 then z ← p[z] ▹ Fall 2 11 Left-Rotate (T, z) ▹ Fall 2 12 color[p[z]] ← BLACK ▹ Fall 3 13 color[p[p[z]]] ← RED ▹ Fall 3 14 Right-Rotate (T, p[p[z]]) ▹ Fall 3 15 else (same as then clause with "right" and "left" exchanged) 16 color[root[T]] ← BLACK
z C C Rot-Schwarz-Baum y D A y D A B B z z C C y D B y D B A A z Fall 1: Der Onkel y von z ist auch rot.
C C B Rot-Schwarz-Baum y y A B C A z B z A z Fall 2: Der Onkel y von z ist schwarz und z ist ein „rechtes“ Kind. Fall 3: Der Onkel y von z ist schwarz und z ist ein „linkes“ Kind.
Rot-Schwarz-Baum RB-DELETE(T, z) 1 if left[z] = nil[T] or right[z] = nil[T] 2 then y ← z 3 else y ← TREE-SUCCESSOR(z) 4 if left[y] ≠ nil[T] 5 then x ← left[y] 6 else x ← right[y] 7 p[x] ← p[y] 8 if p[y] = nil[T] 9 then root[T] ← x 10 else if y = left[p[y]] 11 then left[p[y]] ← x 12 else right[p[y]] ← x 13 if y 3≠ z 14 then key[z] ← key[y] 15 copy y's satellite data into z 16 if color[y] = BLACK 17 then RB-DELETE-FIXUP(T, x) 18 return y Falls ein roter Knoten gelöscht wird, bleiben die Eigenschaften des Rot- Schwarz-Baums erhalten.
Rot-Schwarz-Baum RB-DELETE-FIXUP(T, x) 1 while x ≠ root[T] and color[x] = BLACK 2 do if x = left[p[x]] 3 then w ← right[p[x]] 4 if color[w] = RED 5 then color[w] ← BLACK ▹ Case 1 6 color[p[x]] ← RED ▹ Case 1 7 LEFT-ROTATE(T, p[x]) ▹ Case 1 8 w ← right[p[x]] ▹ Case 1 9 if color[left[w]] = BLACK and color[right[w]] = BLACK 10 then color[w] ← RED ▹ Case 2 11 x ← p[x] ▹ Case 2 12 else if color[right[w]] = BLACK 13 then color[left[w]] ← BLACK ▹ Case 3 14 color[w] ← RED ▹ Case 3 15 RIGHT-ROTATE(T, w) ▹ Case 3 16 w ← right[p[x]] ▹ Case 3 17 color[w] ← color[p[x]] ▹ Case 4 18 color[p[x]] ← BLACK ▹ Case 4 19 color[right[w]] ← BLACK ▹ Case 4 20 LEFT-ROTATE(T, p[x]) ▹ Case 4 21 x ← root[T] ▹ Case 4 22 else (same as then clause with „right" and „left"exchanged) 23 color[x] ← BLACK
Rot-Schwarz-Baum Drei Probleme können hierbei auftreten: [P1] Der entfernte Knoten y war die Wurzel, und ein rotes Kind x von y ist nach dem Löschen von y die neue Wurzel: Lösung: Färbe x schwarz. [P2] Falls das einzige Kind x des gelöschten Knotens y und der Vater von y rot sind, dann ist nach dem Löschen die Bedingung 4 verletzt. [P3] Pfade, die y enthalten haben, haben nun einen schwarzen Knoten weniger. Deshalb ist die Bedingung 5 für alle Vorfahren von Knoten y verletzt.
Rot-Schwarz-Baum Zu [P2] Ist xrot, so färben wir x schwarz und Bedingung 5 ist wieder erfüllt. Dies ist auch der einzige Fall, in dem zwei rote Knoten nach dem Löschen aufeinander folgen können, und somit ist auch Bedingung 4 wieder erfüllt.
Rot-Schwarz-Baum Zu [P3] Ist x schwarz und könnten wir x einen weiteren „Schwarz-Wert“ Zuordnen (also insgesamt 2), so wäre die Bedingung 5 wiederhergestellt. Da ein RS- Baum jedoch keine Zähler für Farbeinheiten besitzt, müssen wir gewisse weitere Reparaturen durchführen, um jeweils den Knoten x mit dem künstlichen Schwarz-Wert von „zwei“ zu reparieren. Dabei hangeln wir (mit x) solange den Pfad zur Wurzel hoch, bis die Verletzung von Bedingung 5 eliminiert ist. Der Knoten w sei immer der Bruder von x. Wir unterscheiden vier Fälle:
x B B w x A D A D C E C E Rot-Schwarz-Baum B D w x A D B E x w A C C E Fall 1: w ist rot. Die blau gezeichneten Knoten können entweder rot oder schwarz gefärbt sein. Fall 2: w ist schwarz und beide Kinder von w sind auch schwarz. Falls B rot ist, dann färben wir B schwarz und D rot und sind fertig.
B D w x A D E B Rot-Schwarz-Baum C C E A B B w x A C w x A D D C E E Fall 3: w ist schwarz und w‘s linkes Kind ist rot. Fall 4: w ist schwarz und w‘s rechtes Kind ist rot D bekommt die Farbe von B
Rot-Schwarz-Baum Zusammenfassung der Reparatur-Prozedur: • Falls wir die Möglichkeit haben den Fehler direkt zu eliminieren (Fall 4), führen wir die entsprechende Transformation sofort aus. • Falls eine sofortige Reparatur nicht möglich ist, transformieren wir den Baum so, dass entweder die Reparatur im nächsten Schritt vollständig erfolgen kann (Fall 3) oder im übernächsten (Fall 1) oder dass zumindest x auf dem Pfad zur Wurzel eine Ebene hochgehoben werden kann (Fall 2). Die Laufzeit der Reparatur-Prozedur und der gesamten DELETE- Operation ist O(log n).