VL-11: Rot-Schwarz Bäume
(Datenstrukturen und Algorithmen, SS 2017) Janosch Fuchs
SS 2017, RWTH
Organisatorisches
• Vorlesung: Gerhard Woeginger (Zimmer 4024 im E1) Sprechstunde: Mittwoch 11:15–12:00
• Übungen: Tim Hartmann, David Korzeniewski, Björn Tauer Email: dsal-i1@algo.rwth-aachen.de
• Webseite:http://algo.rwth-aachen.de/Lehre/SS17/DSA.php
• Nächste Vorlesung:
Dienstag, Mai 30, 16:15–17:45 Uhr, Aula 1 (Mai 25 = Feiertag; keine Vorlesung)
Rot-Schwarz Bäume
• Einführung
• Einfügen in Rot-Schwarz Bäumen
• Löschen in Rot-Schwarz Bäumen
Einführung
Hauptproblem der Suchbäume: Die Effizienz der Operationen hängt von derHöhedes Baumes ab
Einerseits: Je balancierter der Suchbaum, desto besser Andererseits: Dauerndes Rebalancieren kostet Zeit!!
Andererseits: Wie stellt man effizient fest, ob Baum balanciert ist?
Andererseits: Soll man Zusatzinformationen darüber abspeichern?
Grundidee von Rot-Schwarz-Bäumen (Rudolf Bayer, 1972)
1 Zwei Arten von Knoten: Schwarze Knoten werden strikt balanciert, roteKnoten dienen nur alsSchlupf
2 Anteil der Schlupfknoten mussbeschränktbleiben
Also: aufgeweichte Balanciertheitsanforderungen, und wenig zusätzlicher Speicherplatz (1 Bit pro Knoten für Farbe)
Einführung
Hauptproblem der Suchbäume: Die Effizienz der Operationen hängt von derHöhedes Baumes ab
Einerseits: Je balancierter der Suchbaum, desto besser Andererseits: Dauerndes Rebalancieren kostet Zeit!!
Andererseits: Wie stellt man effizient fest, ob Baum balanciert ist?
Andererseits: Soll man Zusatzinformationen darüber abspeichern?
Grundidee von Rot-Schwarz-Bäumen (Rudolf Bayer, 1972)
1 Zwei Arten von Knoten: Schwarze Knoten werden strikt balanciert, roteKnoten dienen nur alsSchlupf
2 Anteil der Schlupfknoten mussbeschränktbleiben
Also: aufgeweichte Balanciertheitsanforderungen, und wenig zusätzlicher Speicherplatz (1 Bit pro Knoten für Farbe)
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder. Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder. Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder. Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder. Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder.
Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder.
Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder.
Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (1)
Rot-Schwarz-Eigenschaft
Ein binärer Suchbaum erfüllt dieRot-Schwarz-Eigenschaft, wenn gilt:
1 Jeder Knoten ist entweder rotoder schwarz gefärbt.
2 Die Wurzel ist schwarz.
3 null-Zeiger (fehlendes Kind, hier enden die Pfade) betrachten wir als externe Knoten mit Farbe schwarz.
4 Jeder nicht-externe Knoten hat genau zwei Kinder.
Jeder roteKnoten hat genau zwei schwarze Kinder.
5 Für jeden Knoten x gilt: alle Pfade, die im Knotenx starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten.
So ein Baum heisst dannRot-Schwarz-Baum(red-black tree, RBT).
Anmerkung: In den Algorithmen verwenden wir fürnull-Zeiger (externe Knoten) die Notationnull.color(== BLACK).
Rot-Schwarz-Bäume (2)
(schwarze) externe Knoten roter Knoten mit
Schwarz-Höhe 3 26
14
7 12
19 23
41
47
28 38
16
21 17
10
3
15 20
30
35 39
Definition: Schwarz-Höhe (black height, bh)
DieSchwarz-Höhe eines externen Blattesbh(null) = 0.
DieSchwarz-Höhe bh(x) eines Knotensx ist die Anzahl schwarzer Knoten bis zu einem externen Blatt (Knotenx selbst ausgenommen).
Rot-Schwarz-Bäume (3)
Zeichnet man dierotenKnoten immer auf der selben Höhe wie ihren Vater ein, dann erhält man:
Schwarzhöhe
26
41
47 14
19 23
16
21
7 12
3 15 20 28 35 38 39
17
10 30
Anmerkung:
Die externen Knoten werden in Zeichnungen oft weggelassen.
Definition
DieSchwarz-Höhebh(t) eines RBTt ist die Schwarz-Höhe der Wurzel.
Rot-Schwarz-Bäume (3)
Zeichnet man dierotenKnoten immer auf der selben Höhe wie ihren Vater ein, dann erhält man:
Schwarzhöhe
26
41
47 14
19 23
16
21
7 12
3 15 20 28 35 38 39
17
10 30
Anmerkung:
Die externen Knoten werden in Zeichnungen oft weggelassen.
Definition
DieSchwarz-Höhebh(t) eines RBTt ist die Schwarz-Höhe der Wurzel.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1). Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit. Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1). Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit. Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1).
Ergo: Ein RBT ist ein relativbalancierter BST. Ergo: Suchen benötigt nur Θ(logn) Zeit. Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1).
Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit. Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1).
Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit.
Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1).
Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit.
Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Elementare Eigenschaften von Rot-Schwarz-Bäumen
Lemma
Ein Rot-Schwarz-Baum t mit Schwarzhöhe bh(t) enthält mindestens 2bh(t)−1 innere Knoten.
enthält höchstens4bh(t)−1innere Knoten.
Beweis: Induktion über die Höhe des Baumes.
Theorem
Ein RBT mitninneren Knoten hat Höhe höchstens 2 log2(n+ 1).
Ergo: Ein RBT ist ein relativbalancierter BST.
Ergo: Suchen benötigt nur Θ(logn) Zeit.
Ergo: Für bstMin,bstSucc, etc. gilt dasselbe.
Mit Einfügen und Löschen werden wir uns noch beschäftigen.
Beweisskizze (zum Nachlesen zu Hause)
Lemma
Es sei x ein Knoten in einem RBT. Dann enthält der Teilbaum mit Wurzel x mindestens2bh(x)−1innere Knoten.
Beweis: Induktion über die Höheh(x) des Knotensx.
Basis: Wennh(x) = 0, dann istx ein Blatt.
Induktionsschritt: Wennh(x)≥1, so hatx zwei KinderyL undyR. Für jedes Kindy vonx gilt:
h(y)≤h(x)−1, und
Wenny rot, dannbh(y) =bh(x); andernfallsbh(y) =bh(x)−1 Induktionsannahme liefert: Der Teilbaum mit Wurzely hat mindestens 2bh(x)−1−1 innere Knoten.
(Teilbaum mit WurzelyL) plus (Teilbaum mit WurzelyR) plus (x) ergibt zusammen mindestens (2bh(x)−1−1) + (2bh(x)−1−1) + 1 = 2bh(x)−1 innere Knoten für den Teilbaum mit Wurzelx. qed
Einfügen in Rot-Schwarz Bäumen
Wiederholung: Einfügen in einen BST / Beispiel
Beispiel
15 5
3 12
10
6
14
16
20
17 31
15 5
3 12
10
6
14
16
20
17
18 31 bstIns(t, Node(18))
Einfügen von Schlüssel k in einen RBT: Grundidee
Einfügen
Zum Einfügen in einen RBT gehen wir zunächst wie beim BST vor:
Finde einen geeigneten freien Platz.
Hängeden neuen Knotenan.
Es bleibt die Frage nach derFarbe:
Färben wir den neuen Knoten schwarz, dann verletzen wir in der Regel die Schwarz-Höhen-Bedingung.
Färben wir ihn aberrot, dann könnten wir die Farbbedingungen verletzen (roteKnoten haben keinerotenKinder).
Wir färben den Knoten daherrot(eine Schwarz-Höhen-Verletzung wäre schwieriger zu behandeln; Rot istlokale, schwarz istglobaleEigenschaft)
Behebeim letzten Schritt die mögliche Farbverletzung.
Einfügen von Schlüssel k in einen RBT: Grundidee
Einfügen
Zum Einfügen in einen RBT gehen wir zunächst wie beim BST vor:
Finde einen geeigneten freien Platz.
Hängeden neuen Knotenan.
Es bleibt die Frage nach derFarbe:
Färben wir den neuen Knoten schwarz, dann verletzen wir in der Regel die Schwarz-Höhen-Bedingung.
Färben wir ihn aberrot, dann könnten wir die Farbbedingungen verletzen (roteKnoten haben keinerotenKinder).
Wir färben den Knoten daherrot(eine Schwarz-Höhen-Verletzung wäre schwieriger zu behandeln; Rot istlokale, schwarz istglobaleEigenschaft)
Behebeim letzten Schritt die mögliche Farbverletzung.
Einfügen von Schlüssel k in einen RBT: Grundidee
Einfügen
Zum Einfügen in einen RBT gehen wir zunächst wie beim BST vor:
Finde einen geeigneten freien Platz.
Hängeden neuen Knotenan.
Es bleibt die Frage nach derFarbe:
Färben wir den neuen Knoten schwarz, dann verletzen wir in der Regel die Schwarz-Höhen-Bedingung.
Färben wir ihn aberrot, dann könnten wir die Farbbedingungen verletzen (roteKnoten haben keinerotenKinder).
Wir färben den Knoten daherrot(eine Schwarz-Höhen-Verletzung wäre schwieriger zu behandeln; Rot istlokale, schwarz istglobaleEigenschaft)
Behebeim letzten Schritt die mögliche Farbverletzung.
Einfügen in einen RBT: Algorithmus, Teil 1
1 v o i d r b t I n s ( T r e e t , N o d e n o d e ) { 2 // F u e g e n o d e in den B a u m t ein
3 b s t I n s ( t , n o d e ) ; // E i n f u e g e n wie b e i m BST 4 n o d e . l e f t = n u l l ;
5 n o d e . r i g h t = n u l l ; 6 n o d e . c o l o r = RED ;
7 // e i n g e f u e g t e r K n o t e n i m m e r z u n a e c h s t rot
8 // s t e l l e Rot - S c hw ar z - E i g e n s c h a f t ggf . w i e d e r her 9 r b t I n s F i x ( t , n o d e ) ;
10 }
Einfügen: Was kann passieren? (1)
c
node
c node
c
node
c node
Der neu eingefügte Knoten ist immer rot.
Ist Vaterknoten c schwarz, haben wir kein Problem.
Ist Vaterknoten c aberrot, so liegt eineRot-Rot-Verletzungvor, die wir behandeln müssen.
Die beiden unteren Fälle lassen sich symmetrisch zu den oberen Fällen lösen. Daher diskutieren wir nur die oberen Situationen.
Einfügen: Was kann passieren? (1)
c
node
c node
c
node
c node
Der neu eingefügte Knoten ist immer rot.
Ist Vaterknoten c schwarz, haben wir kein Problem.
Ist Vaterknoten c aberrot, so liegt eineRot-Rot-Verletzungvor, die wir behandeln müssen.
Die beiden unteren Fälle lassen sich symmetrisch zu den oberen Fällen lösen. Daher diskutieren wir nur die oberen Situationen.
Einfügen: Was kann passieren? (1)
c
node
c node
c
node
c node
Der neu eingefügte Knoten ist immer rot.
Ist Vaterknoten c schwarz, haben wir kein Problem.
Ist Vaterknoten c aberrot, so liegt eineRot-Rot-Verletzungvor, die wir behandeln müssen.
Die beiden unteren Fälle lassen sich symmetrisch zu den oberen Fällen lösen. Daher diskutieren wir nur die oberen Situationen.
Einfügen: Was kann passieren? (1)
c
node
c node
c
node
c node
Der neu eingefügte Knoten ist immer rot.
Ist Vaterknoten c schwarz, haben wir kein Problem.
Ist Vaterknoten c aberrot, so liegt eineRot-Rot-Verletzungvor, die wir behandeln müssen.
Die beiden unteren Fälle lassen sich symmetrisch zu den oberen Fällen lösen. Daher diskutieren wir nur die oberen Situationen.
Einfügen: Was kann passieren? (2)
Wir müssen nun Grossvaterd und Onkelemit berücksichtigen:
d
c e
d
c e
Der Grossvater des eingefügten Knotens war schwarz, denn es handelte sich vor dem Einfügen um einen korrekten RBT.
Fall 1
Ist Onkelerot, dann stellen wir durch Umfärben voncund eauf schwarz sowied auf rotdie Rot-Schwarz-Eigenschaft lokal wieder her.
Zwei Ebenenweiter oben kann nun eineRot-Rot-Verletzung vorliegen, die nach selben Schemaiterativaufgelöst wird. Ist d allerdings dieWurzel, dann färben wir sie einfach wieder schwarz. Dadurch erhöht sich die Schwarzhöhe des Baumes um 1.
Einfügen: Was kann passieren? (2)
Wir müssen nun Grossvaterd und Onkelemit berücksichtigen:
d
c e
d
c e
Der Grossvater des eingefügten Knotens war schwarz, denn es handelte sich vor dem Einfügen um einen korrekten RBT.
Fall 1
Ist Onkelerot, dann stellen wir durch Umfärben voncund eauf schwarz sowied aufrotdie Rot-Schwarz-Eigenschaft lokal wieder her.
Zwei Ebenenweiter oben kann nun eineRot-Rot-Verletzung vorliegen, die nach selben Schemaiterativaufgelöst wird. Ist d allerdings dieWurzel, dann färben wir sie einfach wieder schwarz. Dadurch erhöht sich die Schwarzhöhe des Baumes um 1.
Einfügen: Was kann passieren? (2)
Wir müssen nun Grossvaterd und Onkelemit berücksichtigen:
d
c e
d
c e
Der Grossvater des eingefügten Knotens war schwarz, denn es handelte sich vor dem Einfügen um einen korrekten RBT.
Fall 1
Ist Onkelerot, dann stellen wir durch Umfärben voncund eauf schwarz sowied aufrotdie Rot-Schwarz-Eigenschaft lokal wieder her.
Zwei Ebenenweiter oben kann nun eineRot-Rot-Verletzung vorliegen, die nach selben Schemaiterativaufgelöst wird.
Ist d allerdings dieWurzel, dann färben wir sie einfach wieder schwarz. Dadurch erhöht sich die Schwarzhöhe des Baumes um 1.
Einfügen: Was kann passieren? (2)
Wir müssen nun Grossvaterd und Onkelemit berücksichtigen:
d
c e
d
c e
Der Grossvater des eingefügten Knotens war schwarz, denn es handelte sich vor dem Einfügen um einen korrekten RBT.
Fall 1
Ist Onkelerot, dann stellen wir durch Umfärben voncund eauf schwarz sowied aufrotdie Rot-Schwarz-Eigenschaft lokal wieder her.
Zwei Ebenenweiter oben kann nun eineRot-Rot-Verletzung vorliegen, die nach selben Schemaiterativaufgelöst wird.
Ist d allerdings dieWurzel, dann färben wir sie einfach wieder schwarz. Dadurch erhöht sich die Schwarzhöhe des Baumes um 1.
Einfügen: Was kann passieren? (3)
Ist der Onkeledagegen schwarz, so erhalten wir Fall 2 und Fall 3:
d
c e
d
c e
Fall 2 Fall 3
Fall 2
Dieser Fall lässt sich durch Linksrotation umc auf Fall 3 reduzieren. Schwarz-Höhe des linken Teilbaumes vond ändert das nicht. Derbisherige Vaterknotenc wird dabei zum linken, roten Kind, das eine Rot-Rot-Verletzung mit demneuen Vater (c im rechten Bild) hat. Diese Verletzung wird wie im Fall 3 behoben.
Einfügen: Was kann passieren? (3)
Ist der Onkeledagegen schwarz, so erhalten wir Fall 2 und Fall 3:
d
c e
d
c e
Fall 2 Fall 3
Fall 2
Dieser Fall lässt sich durch Linksrotation umc auf Fall 3 reduzieren.
Schwarz-Höhe des linken Teilbaumes vond ändert das nicht. Derbisherige Vaterknotenc wird dabei zum linken, roten Kind, das eine Rot-Rot-Verletzung mit demneuen Vater (c im rechten Bild) hat. Diese Verletzung wird wie im Fall 3 behoben.
Einfügen: Was kann passieren? (3)
Ist der Onkeledagegen schwarz, so erhalten wir Fall 2 und Fall 3:
d
c e
d
c e
Fall 2 Fall 3
Fall 2
Dieser Fall lässt sich durch Linksrotation umc auf Fall 3 reduzieren.
Schwarz-Höhe des linken Teilbaumes vond ändert das nicht.
Derbisherige Vaterknotenc wird dabei zum linken, roten Kind, das eine Rot-Rot-Verletzung mit demneuen Vater (c im rechten Bild) hat. Diese Verletzung wird wie im Fall 3 behoben.
Einfügen: Was kann passieren? (3)
Ist der Onkeledagegen schwarz, so erhalten wir Fall 2 und Fall 3:
d
c e
d
c e
Fall 2 Fall 3
Fall 2
Dieser Fall lässt sich durch Linksrotation umc auf Fall 3 reduzieren.
Schwarz-Höhe des linken Teilbaumes vond ändert das nicht.
Derbisherige Vaterknotenc wird dabei zum linken, roten Kind, das eine Rot-Rot-Verletzung mit demneuen Vater (c im rechten Bild) hat. Diese Verletzung wird wie im Fall 3 behoben.
Einfügen: Was kann passieren? (4)
d
c e
bh(·) =x+ 1
x x
x
−→
c
d
e bh(·) =x x
x x
x
Fall 3
Zunächst rotieren wir um d nach rechts, wobei wir die Schwarz-Höhen im Auge behalten.
Um die Schwarz-Höhen der Kinder vonc wieder in Einklang zu bringen, färben wir Knotend rot. Da dessen nun linkes Kind ursprünglich am rotenc hing, ist das unproblematisch. Schlussendlich färben wirc schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes.
Einfügen: Was kann passieren? (4)
d
c e
bh(·) =x+ 1
x x
x
−→
c
d
e bh(·) =???
x
x
x+ 1 x
Fall 3
Zunächst rotieren wir um d nach rechts, wobei wir die Schwarz-Höhen im Auge behalten.
Um die Schwarz-Höhen der Kinder vonc wieder in Einklang zu bringen, färben wir Knotend rot. Da dessen nun linkes Kind ursprünglich am rotenc hing, ist das unproblematisch.
Schlussendlich färben wirc schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes.
Einfügen: Was kann passieren? (4)
d
c e
bh(·) =x+ 1
x x
x
−→
c
d
e bh(·) =x x
x x
x
Fall 3
Zunächst rotieren wir um d nach rechts, wobei wir die Schwarz-Höhen im Auge behalten.
Um die Schwarz-Höhen der Kinder vonc wieder in Einklang zu bringen, färben wir Knotend rot. Da dessen nun linkes Kind ursprünglich am rotenc hing, ist das unproblematisch.
Schlussendlich färben wirc schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes.
Einfügen: Was kann passieren? (4)
d
c e
bh(·) =x+ 1
x x
x
−→
c
d
e bh(·) =x+ 1 x
x x
x
Fall 3
Zunächst rotieren wir um d nach rechts, wobei wir die Schwarz-Höhen im Auge behalten.
Um die Schwarz-Höhen der Kinder vonc wieder in Einklang zu bringen, färben wir Knotend rot. Da dessen nun linkes Kind ursprünglich am rotenc hing, ist das unproblematisch.
Schlussendlich färben wirc schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes.
Einfügen in einen RBT: Algorithmus, Teil 2
1 // B e h e b e e v e n t u e l l e Rot - Rot - V e r l e t z u n g mit V a t e r 2 // K n o t e n n o d e ist rot
3 v o i d r b t I n s F i x ( T r e e t , N o d e n o d e ) {
4 // s o l a n g e n o c h e i n e Rot - Rot - V e r l e t z u n g b e s t e h t 5 w h i l e ( n o d e . p a r e n t . c o l o r == RED ) {
6 if ( n o d e . p a r e n t == n o d e . p a r e n t . p a r e n t . l e f t ) { 7 // der von uns b e t r a c h t e t e F a l l
8 n o d e = l e f t A d j u s t ( t , n o d e ) ; 9 // n o d e j e t z t w e i t e r o b e n ?
10 // ( n o d e = n o d e . p a r e n t . p a r e n t im F a l l 1 von l e f t A d j u s t )
11 } e l s e {
12 // der d a z u s y m m e t r i s c h e r F a l l 13 n o d e = r i g h t A d j u s t ( t , n o d e ) ;
14 }
15 }
16 t . r o o t . c o l o r = B L A C K ; // W u r z e l b l e i b t s c h w a r z 17 }
Einfügen in einen RBT: Algorithmus Teil 3
1 N o d e l e f t A d j u s t ( T r e e t , N o d e n o d e ) { 2 N o d e u n c l e = n o d e . p a r e n t . p a r e n t . r i g h t ; 3 if ( u n c l e . c o l o r == RED ) { // F a l l 1
4 n o d e . p a r e n t . p a r e n t . c o l o r = RED ; // G r o s s v a t e r 5 n o d e . p a r e n t . c o l o r = B L A C K ; // V a t e r
6 u n c l e . c o l o r = B L A C K ; // O n k e l
7 r e t u r n n o d e . p a r e n t . p a r e n t ; // p r u e f e Rot - Rot w e i t e r o b e n
8 } e l s e { // F a l l 2 und 3
9 if ( n o d e == n o d e . p a r e n t . r i g h t ) { // F a l l 2 10 // d i e s e r K n o t e n w i r d das linke , r o t e K i n d : 11 n o d e = n o d e . p a r e n t ;
12 l e f t R o t a t e ( t , n o d e ) ;
13 } // F a l l 3
14 r i g h t R o t a t e ( t , n o d e . p a r e n t . p a r e n t ) ; 15 n o d e . p a r e n t . c o l o r = B L A C K ;
16 n o d e . p a r e n t . r i g h t . c o l o r = RED ;
17 r e t u r n n o d e ; // fertig , n o d e . p a r e n t . c o l o r == B L A C K
18 }
19 }
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt.
Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt.
Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt.
Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt.
Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Einfügen in einen RBT: Analyse
Zeitkomplexität Einfügen
Die Worst-Case Laufzeit vonrbtInsfür einen Rot-Schwarz-Baum mitn inneren Knoten istO(logn).
Beweisskizze:
Die Worst-Case Laufzeit vonbstInsistO(logn).
Die Schleife inrbtInsFixwird nur wiederholt wenn Fall 1 auftrittt.
Dann steigt der Zeigernodezwei Ebenen im Baum auf.
Die maximal Anzahl der Schleifen ist damitO(logn).
Es werden höchstens zwei Rotationen ausgeführt, da die Schleife in
rbtInsFix terminiert, wenn Fall 2 oder 3 auftritt. (Fall 1 involviert keine Rotationen.)
Ergo: Gesamtanzahl der Rotationen ist konstant und eine Rotation läuft inO(1).
Somit benötigt rbtInseine GesamtzeitO(logn).
Löschen in Rot-Schwarz Bäumen
Wiederholung: Löschen im BST / Strategie
Löschen
Um Knotennodeaus dem BST zu löschen, verfahren wir folgendermassen:
Fall 1:nodehat keine Kinder:
Ersetze im Vaterknoten vonnodeden Zeiger aufnode durchnull
Fall 2:nodehat ein Kind:
Wir schneidennode aus, indem wir den Vater und das Kind direkt miteinander verbinden (den Teilbaumersetzen).
Fall 3:nodehat zwei Kinder:
Wir finden denNachfolgervonnode, entfernen ihn aus seiner ursprünglichen Position undtauschennodegegen den Nachfolger.
Anmerkung: Der Nachfolger hat höchstens ein Kind.
Wiederholung: Löschen im BST / (k)ein Kind
5
3 12
16 20 17 31 6
15
10 14
5
3 12
16 20 17 31 6
15
10
5
3 20
17 31 6
15
10 14 12
16 5
3 20
17 31 6
15
10 14 12
Wiederholung: Löschen im BST / zwei Kinder
3 20
17 31
6 15
10 14 12
16 5
3 20
17 31
6 15
10 14 12
16 5
3 20
17 31 6
15
10 14 12
16
Löschen im RBT: Strategie (1)
Löschen
Um die Farbbedingungen aufrecht zu erhalten, müssen wir unser altes Löschverfahren für BSTs ergänzen:
(1) Löschen wir einenrotenKnoten, bleibt alles beim alten:
1 Im Baum werden keine Schwarzhöhen geändert
2 Es entstehen keine benachbartenroten Knoten
3 Die Wurzel bleibt schwarz. Dieser Fall ist harmlos.
(2) Löschen wir hingegen einen schwarzen Knoten, so ändert sich der Schwarzwert des Pfades, der zuvor den gelöschten Knoten enthalten hat. Diese Schwarz-Höhen-Verletzung muss repariert werden.
Löschen im RBT: Strategie (1)
Löschen
Um die Farbbedingungen aufrecht zu erhalten, müssen wir unser altes Löschverfahren für BSTs ergänzen:
(1) Löschen wir einenrotenKnoten, bleibt alles beim alten:
1 Im Baum werden keine Schwarzhöhen geändert
2 Es entstehen keine benachbartenroten Knoten
3 Die Wurzel bleibt schwarz. Dieser Fall ist harmlos.
(2) Löschen wir hingegen einen schwarzen Knoten, so ändert sich der Schwarzwert des Pfades, der zuvor den gelöschten Knoten enthalten hat. Diese Schwarz-Höhen-Verletzung muss repariert werden.
Löschen im RBT: Strategie (1)
Löschen
Um die Farbbedingungen aufrecht zu erhalten, müssen wir unser altes Löschverfahren für BSTs ergänzen:
(1) Löschen wir einenrotenKnoten, bleibt alles beim alten:
1 Im Baum werden keine Schwarzhöhen geändert
2 Es entstehen keine benachbartenroten Knoten
3 Die Wurzel bleibt schwarz. Dieser Fall ist harmlos.
(2) Löschen wir hingegen einen schwarzen Knoten, so ändert sich der Schwarzwert des Pfades, der zuvor den gelöschten Knoten enthalten hat. Diese Schwarz-Höhen-Verletzung muss repariert werden.
Löschen im RBT: Strategie (1)
Löschen
Um die Farbbedingungen aufrecht zu erhalten, müssen wir unser altes Löschverfahren für BSTs ergänzen:
(1) Löschen wir einenrotenKnoten, bleibt alles beim alten:
1 Im Baum werden keine Schwarzhöhen geändert
2 Es entstehen keine benachbartenroten Knoten
3 Die Wurzel bleibt schwarz.
Dieser Fall ist harmlos.
(2) Löschen wir hingegen einen schwarzen Knoten, so ändert sich der Schwarzwert des Pfades, der zuvor den gelöschten Knoten enthalten hat. Diese Schwarz-Höhen-Verletzung muss repariert werden.
Löschen im RBT: Strategie (1)
Löschen
Um die Farbbedingungen aufrecht zu erhalten, müssen wir unser altes Löschverfahren für BSTs ergänzen:
(1) Löschen wir einenrotenKnoten, bleibt alles beim alten:
1 Im Baum werden keine Schwarzhöhen geändert
2 Es entstehen keine benachbartenroten Knoten
3 Die Wurzel bleibt schwarz.
Dieser Fall ist harmlos.
(2) Löschen wir hingegen einen schwarzen Knoten, so ändert sich der Schwarzwert des Pfades, der zuvor den gelöschten Knoten enthalten hat.
Diese Schwarz-Höhen-Verletzung muss repariert werden.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode. Der Baum bleibt ein gültiger RBT.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode. Der Baum bleibt ein gültiger RBT.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode. Der Baum bleibt ein gültiger RBT.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode. Der Baum bleibt ein gültiger RBT.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode.
Der Baum bleibt ein gültiger RBT.
Löschen im RBT: Strategie (2)
Löschen
Für den Fall, dassnodezwei Kinder hat:
1 Wir finden denNachfolgervonnode
2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur
rbtDel) aus seiner ursprünglichen Position
3 Wirbeheben dabei die möglich auftretende Farbverletzung
4 Wir ersetzen nodedurch den Nachfolger, und
5 übernehmen dabei diemöglicherweise neueFarbe vonnode. Der Baum bleibt ein gültiger RBT.
Wiederholung: Löschen im BST / Algorithmus (VL-10)
1 // E n t f e r n t n o d e aus dem B a u m .
2 // D a n a c h k a n n n o d e ggf . aus S p e i c h e r e n t f e r n t w e r d e n 3 v o i d b s t D e l ( T r e e t , N o d e n o d e ) {
4 if ( n o d e . l e f t && n o d e . r i g h t ) { // z w e i K i n d e r 5 N o d e tmp = b s t M i n ( n o d e . r i g h t ) ; // f i n d e N a c h f o l g e r 6 b s t D e l ( t , tmp ) ; // l o e s c h e N a c h f o l g e r
7 b s t S w a p ( t , node , tmp ) ;
8 } e l s e if ( n o d e . l e f t ) { // ein Kind , l i n k s 9 b s t R e p l a c e ( t , node , n o d e . l e f t ) ;
10 } e l s e { // ein o d e r k e i n K i n d ( n o d e . r i g h t == n u l l ) 11 b s t R e p l a c e ( t , node , n o d e . r i g h t ) ;
12 }
13 }
Wiederholung: Löschen im BST / Variante von VL-10
1 // E n t f e r n t n o d e aus dem B a u m .
2 // D a n a c h k a n n n o d e ggf . aus S p e i c h e r e n t f e r n t w e r d e n 3 v o i d b s t D e l ( T r e e t , N o d e n o d e ) {
4 if ( n o d e . l e f t && n o d e . r i g h t ) { // z w e i K i n d e r 5 N o d e tmp = b s t M i n ( n o d e . r i g h t ) ; // f i n d e N a c h f o l g e r 6 b s t D e l ( t , tmp ) ; // l o e s c h e N a c h f o l g e r
7 b s t S w a p ( t , node , tmp ) ;
8 } e l s e { // ein Kind , o d e r k e i n K i n d 9 N o d e c h i l d ; // H i l f s v a r i a b l e
10 if ( n o d e . l e f t ) c h i l d = n o d e . l e f t ; // K i n d ist l i n k s 11 e l s e if ( n o d e . r i g h t ) c h i l d = n o d e . r i g h t ; // r e c h t s 12 e l s e c h i l d = n u l l ; // k e i n K i n d
13 b s t R e p l a c e ( t , node , c h i l d ) ;
14 }
15 }
Löschen im RBT: Algorithmus, Teil 1
1 // E n t f e r n t n o d e aus dem B a u m . 2 v o i d r b t D e l ( T r e e t , N o d e n o d e ) {
3 if ( n o d e . l e f t && n o d e . r i g h t ) { // z w e i K i n d e r
4 N o d e tmp = b s t M i n ( n o d e . r i g h t ) ; // f i n d e N a c h f o l g e r 5 r b t D e l ( t , tmp ) ; // l o e s c h e N a c h f o l g e r
6 b s t S w a p ( t , node , tmp ) ; // e r s e t z e n o d e d u r c h N f o l g e r 7 tmp . c o l o r = n o d e . c o l o r ; // u e b e r n i m m die F a r b e 8 } e l s e { // ein Kind , o d e r k e i n K i n d
9 N o d e c h i l d ; // H i l f s v a r i a b l e
10 if ( n o d e . l e f t ) c h i l d = n o d e . l e f t ; // K i n d ist l i n k s 11 e l s e if ( n o d e . r i g h t ) c h i l d = n o d e . r i g h t ; // r e c h t s 12 e l s e c h i l d = n u l l ; // k e i n K i n d
13 r b t D e l F i x ( t , node , c h i l d ) ; 14 b s t R e p l a c e ( t , node , c h i l d ) ;
15 }
16 }
Löschen im RBT: Beispiel 1
23 13
7 18
17
30
28 35
38
23 13
7 18
17
30
28 38
rbtDel(t, 35)
Wie beim BST tritt der rechte Teilbaum von 35 an dessen Stelle.
Da einer der beiden Knoten rot ist, kann vorher die Farbe der Knoten einfach vertauscht werden. Dazu färben wir Knoten 38 schwarz (Knoten 35 wird sowieso gelöscht).
Wäre auch 38 bereits schwarz gewesen, hätten wir die Verletzung aufwändiger weiter oben beheben müssen, indem 35 seinen Schwarzwert in Richtung Wurzel „weitergibt“.
Löschen im RBT: Beispiel 1
23 13
7 18
17
30
28 35
38
23 13
7 18
17
30
28 38
rbtDel(t, 35)
Wie beim BST tritt der rechte Teilbaum von 35 an dessen Stelle.
Da einer der beiden Knoten rot ist, kann vorher die Farbe der Knoten einfach vertauscht werden. Dazu färben wir Knoten 38 schwarz (Knoten 35 wird sowieso gelöscht).
Wäre auch 38 bereits schwarz gewesen, hätten wir die Verletzung aufwändiger weiter oben beheben müssen, indem 35 seinen Schwarzwert in Richtung Wurzel „weitergibt“.
Löschen im RBT: Beispiel 1
23 13
7 18
17
30
28 35
38
23 13
7 18
17
30
28 38
rbtDel(t, 35)
Wie beim BST tritt der rechte Teilbaum von 35 an dessen Stelle.
Da einer der beiden Knoten rot ist, kann vorher die Farbe der Knoten einfach vertauscht werden. Dazu färben wir Knoten 38 schwarz (Knoten 35 wird sowieso gelöscht).
Wäre auch 38 bereits schwarz gewesen, hätten wir die Verletzung aufwändiger weiter oben beheben müssen, indem 35 seinen Schwarzwert in Richtung Wurzel „weitergibt“.
Löschen im RBT – Beispiel 2
23 13
7 18
17
30
28 35
38
23 13
7 18
17
30
28 38
35 rbtDel(t, 30)
1.
2.
Da Knoten 30 zwei Kinder hat, finden wir zuerst den Nachfolger.
Lösche 35 derart, dass die RBT-Eigenschaft erhalten bleibt (siehe voriges Beispiel).
Ersetze 30 durch freie 35, wobei die Farbe von 30 übernommen wird.
Löschen im RBT – Beispiel 2
23 13
7 18
17
30
28 35
38
23 13
7 18
17
30
28 38
35 rbtDel(t, 30)
1.
2.
Da Knoten 30 zwei Kinder hat, finden wir zuerst den Nachfolger.
Lösche 35 derart, dass die RBT-Eigenschaft erhalten bleibt (siehe voriges Beispiel).
Ersetze 30 durch freie 35, wobei die Farbe von 30 übernommen wird.
Löschen im RBT – Beispiel 2
23 13
7 18
17
30
28 35
38
23 13
7 18
17
35
28 38
30 rbtDel(t, 30)
Da Knoten 30 zwei Kinder hat, finden wir zuerst den Nachfolger.
Lösche 35 derart, dass die RBT-Eigenschaft erhalten bleibt (siehe voriges Beispiel).
Ersetze 30 durch freie 35, wobei die Farbe von 30 übernommen wird.
Löschen im RBT: Algorithmus, Teil 2
1 // n o d e s o l l g e l o e s c h t werden , c h i l d ist e i n z i g e s K i n d 2 // ( bzw . n o d e hat k e i n e Kinder , und c h i l d == n u l l ) ; 3 // Ist n o d e rot , so ist n i c h t s zu tun ; s o n s t s u c h e n wir 4 // e i n e n r o t e n Knoten , der d u r c h U m f a e r b e n auf s c h w a r z 5 // die s c h w a r z e F a r b e von n o d e u e b e r n i m m t
6 v o i d r b t D e l F i x ( T r e e t , N o d e node , N o d e c h i l d ) { 7 if ( n o d e . c o l o r == RED ) r e t u r n ;
8 if ( c h i l d != n u l l && c h i l d . c o l o r == RED ) { 9 c h i l d . c o l o r = B L A C K ;
10 } e l s e {
11 N o d e s e a r c h P o s = n o d e ;
12 // s o l a n g e S c h w a r z w e r t n i c h t e i n g e f u e g t w e r d e n k a n n 13 w h i l e ( s e a r c h P o s . p a r e n t && s e a r c h P o s . c o l o r == B L A C K ) { 14 if ( s e a r c h P o s == s e a r c h P o s . p a r e n t . l e f t ) // l i n k e s K i n d 15 s e a r c h P o s = d e l L e f t A d j u s t ( t , s e a r c h P o s ) ;
16 e l s e // r e c h t e s K i n d
17 s e a r c h P o s = d e l R i g h t A d j u s t ( t , s e a r c h P o s ) ;
18 }
19 s e a r c h P o s . c o l o r = B L A C K ;
20 }
21 }
Löschen im RBT: Algorithmus, Teil 3a
1 // E r l e i c h t e r t n o d e um e i n e n S c h w a r z w e r t , 2 // w o b e i n o d e das l i n k e K i n d ist .
3 N o d e d e l L e f t A d j u s t ( T r e e t , N o d e n o d e ) {
4 // b r o t h e r e x i s t i e r t i m m e r w e g e n S c h w a r z h o e h e 5 N o d e b r o t h e r = n o d e . p a r e n t . r i g h t ;
6 if ( b r o t h e r . c o l o r == RED ) { 7 // F a l l 1: R e d u k t i o n auf 2 ,3 ,4 8 b r o t h e r . c o l o r = B L A C K ;
9 n o d e . p a r e n t . c o l o r = RED ; // V a t e r 10 l e f t R o t a t e ( t , n o d e . p a r e n t ) ;
11 b r o t h e r = n o d e . p a r e n t . r i g h t ; // nun B r u d e r von n o d e
12 }
→ wird auf nächster Seite fortgesetzt
Löschen im RBT: Algorithmus, Teil 3b
12 if ( b r o t h e r . l e f t . c o l o r == B L A C K &&
13 b r o t h e r . r i g h t . c o l o r == B L A C K ) { // F a l l 2 14 b r o t h e r . c o l o r = RED ;
15 r e t u r n n o d e . p a r e n t ; // Doppel - s c h w a r z w e i t e r o b e n ...
16 } e l s e { // F a l l 3 und 4
17 if ( b r o t h e r . r i g h t . c o l o r == B L A C K ) // F a l l 3 18 b r o t h e r . l e f t . c o l o r = B L A C K ;
19 b r o t h e r . c o l o r = RED ; 20 r i g h t R o t a t e ( t , b r o t h e r ) ;
21 b r o t h e r = n o d e . p a r e n t . r i g h t ; // nun B r u d e r von n o d e
22 } // F a l l 4
23 b r o t h e r . c o l o r = n o d e . p a r e n t . c o l o r ; 24 n o d e . p a r e n t . c o l o r = B L A C K ;
25 b r o t h e r . r i g h t . c o l o r = B L A C K ; 26 l e f t R o t a t e ( t , n o d e . p a r e n t ) ; 27 r e t u r n t . r o o t ; // F e r t i g .
28 }
29 }
Der Löschalgorithmus: Fall 1
Fall 1:(Reduktion auf Fall 2, 3 oder 4)
sPos brother
−→ −→
sPos
neuer brother
Der Löschalgorithmus: Fall 2
Fall 2:
c
sPos brother
−→
c neuer sPos
Der Löschalgorithmus: Fall 3
Fall 3:(Reduktion auf Fall 4)
c
sPos brother
−→
c
−→
c sPos
neuer brother
Der Löschalgorithmus: Fall 4
Fall 4:
c
d
sPos brother
−→
c d
−→
c
d