Rot-Schwarz-Baum

19
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

description

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. - PowerPoint PPT Presentation

Transcript of Rot-Schwarz-Baum

Page 1: Rot-Schwarz-Baum

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

Page 2: Rot-Schwarz-Baum

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.

Page 3: Rot-Schwarz-Baum

Rot-Schwarz-Baum

26

4117

47

10

30

35 392015

3

10 382823

21

1916

14

127

NULL

NULL NULL

NULL

NULL

NULL NULL

NULL NULL

NULL NULL

NULL

NULL

NULL

NULLNULL

NULL

NULLNULL

NULL

NULL

Page 4: Rot-Schwarz-Baum

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.

Page 5: Rot-Schwarz-Baum

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.

Page 6: Rot-Schwarz-Baum

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]] ← y10 left[y] ← x Put ▹ x on y's left.11 p[x] ← y

Page 7: Rot-Schwarz-Baum

Rot-Schwarz-Baum

Beispiel:10

5 14

3 7 12 17

16 18

x

y

10

5

143 7

12

17

16

18x

y

Left-Rotate(T,x)

Page 8: Rot-Schwarz-Baum

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] ← z11 else if key[z] < key[y]12 then left[y] ← z13 else right[y] ← z14 left[z] ← nil[T]15 right[z] ← nil[T]16 color[z] ← RED17 RB-INSERT-FIXUP(T, z)

Bis Zeile 13 entspricht der Algorithmus dem Einfügen in einen herkömmlichen Binären Suchbaum.

Page 9: Rot-Schwarz-Baum

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 ▹ Fall 1 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 211 Left-Rotate (T, z) ▹ Fall 212 color[p[z]] ← BLACK ▹ Fall 313 color[p[p[z]]] ← RED ▹ Fall 314 Right-Rotate (T, p[p[z]]) ▹ Fall 315 else (same as then clause with "right" and "left" exchanged)16 color[root[T]] ← BLACK

Page 10: Rot-Schwarz-Baum

Rot-Schwarz-Baum

C

A

B

D

z

y

C

A

B

D

z

y

C

B

A

D

z

y

C

B D

z

y

A

Fall 1: Der Onkel y von z ist auch rot.

Page 11: Rot-Schwarz-Baum

Rot-Schwarz-Baum

C

A

B z

y

C

A

B

z

y

Fall 2: Der Onkel y von z ist schwarz und z ist ein „rechtes“ Kind.

CA

B

z

Fall 3: Der Onkel y von z ist schwarz und z ist ein „linkes“ Kind.

Page 12: Rot-Schwarz-Baum

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] ← x10 else if y = left[p[y]]11 then left[p[y]] ← x12 else right[p[y]] ← x13 if y 3≠ z14 then key[z] ← key[y]15 copy y's satellite data into z16 if color[y] = BLACK17 then RB-DELETE-FIXUP(T, x)18 return y

Falls ein roter Knoten gelöscht wird, bleiben die Eigenschaften des Rot-Schwarz-Baums erhalten.

Page 13: Rot-Schwarz-Baum

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]] = BLACK10 then color[w] ← RED Case 2▹11 x ← p[x] Case 2▹12 else if color[right[w]] = BLACK13 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

Page 14: Rot-Schwarz-Baum

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.

Page 15: Rot-Schwarz-Baum

Rot-Schwarz-Baum

Zu [P2]

Ist x rot, 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.

Page 16: Rot-Schwarz-Baum

Rot-Schwarz-Baum

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:

Zu [P3]

Page 17: Rot-Schwarz-Baum

Rot-Schwarz-Baum

AE

C

D

B

x w

A

EC

D

B

x w

Fall 1: w ist rot.

A

EC

D

B

x w

Fall 2: w ist schwarz und beide Kinder von w sind auch schwarz.

A

EC

D

B

x

Falls B rot ist, dann färben wir B schwarz und D rot und sind fertig.

Die blau gezeichneten Knoten können entweder rot oder schwarz gefärbt sein.

Page 18: Rot-Schwarz-Baum

Rot-Schwarz-Baum

Fall 3: w ist schwarz und w‘s linkes Kind ist rot.

A

EC

D

B

x w A

E

D

C

B

x w

A

EC

D

B

x w

Fall 4: w ist schwarz und w‘s rechtes Kind ist rot

A

E

C

D

B

D bekommt die Farbe von B

Page 19: Rot-Schwarz-Baum

Rot-Schwarz-Baum

Zusammenfassung der Reparatur-Prozedur:(1) Falls wir die Möglichkeit haben den Fehler direkt zu eliminieren

(Fall 4), führen wir die entsprechende Transformation sofort aus.(2) 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).