VL-11: Rot-Schwarz Bäume (Datenstrukturen und Algorithmen, SS 2017) Janosch Fuchs SS 2017, RWTH DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 1/41 Organisatorisches • Vorlesung: Gerhard Woeginger (Zimmer 4024 im E1) Sprechstunde: Mittwoch 11:15–12:00 • Übungen: Tim Hartmann, David Korzeniewski, Björn Tauer Email: [email protected] • 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) DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 2/41 Rot-Schwarz Bäume • Einführung • Einfügen in Rot-Schwarz Bäumen • Löschen in Rot-Schwarz Bäumen DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 3/41 Einführung Hauptproblem der Suchbäume: Die Effizienz der Operationen hängt von der Höhe des 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? DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 4/41 Einführung Hauptproblem der Suchbäume: Die Effizienz der Operationen hängt von der Höhe des 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, rote Knoten dienen nur als Schlupf 2 Anteil der Schlupfknoten muss beschränkt bleiben Also: aufgeweichte Balanciertheitsanforderungen, und wenig zusätzlicher Speicherplatz (1 Bit pro Knoten für Farbe) DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 4/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 DSAL/SS 2017 Jeder Knoten ist entweder rot oder schwarz gefärbt. VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder schwarz gefärbt. 2 Die Wurzel ist schwarz. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder 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. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder 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 rote Knoten hat genau zwei schwarze Kinder. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder 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 rote Knoten hat genau zwei schwarze Kinder. 5 Für jeden Knoten x gilt: alle Pfade, die im Knoten x starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder 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 rote Knoten hat genau zwei schwarze Kinder. 5 Für jeden Knoten x gilt: alle Pfade, die im Knoten x starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten. So ein Baum heisst dann Rot-Schwarz-Baum (red-black tree, RBT). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (1) Rot-Schwarz-Eigenschaft Ein binärer Suchbaum erfüllt die Rot-Schwarz-Eigenschaft, wenn gilt: 1 Jeder Knoten ist entweder rot oder 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 rote Knoten hat genau zwei schwarze Kinder. 5 Für jeden Knoten x gilt: alle Pfade, die im Knoten x starten und in einem externen Knoten enden, enthalten die selbe Anzahl an schwarzen Knoten. So ein Baum heisst dann Rot-Schwarz-Baum (red-black tree, RBT). Anmerkung: In den Algorithmen verwenden wir für null-Zeiger (externe Knoten) die Notation null.color (== BLACK). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 5/41 Rot-Schwarz-Bäume (2) roter Knoten mit Schwarz-Höhe 3 26 41 17 14 10 7 16 12 15 30 21 19 23 38 28 20 47 35 39 3 (schwarze) externe Knoten Definition: Schwarz-Höhe (black height, bh) Die Schwarz-Höhe eines externen Blattes bh(null) = 0. Die Schwarz-Höhe bh(x ) eines Knotens x ist die Anzahl schwarzer Knoten bis zu einem externen Blatt (Knoten x selbst ausgenommen). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 6/41 Rot-Schwarz-Bäume (3) Schwarzhöhe Zeichnet man die roten Knoten immer auf der selben Höhe wie ihren Vater ein, dann erhält man: 17 10 3 7 26 14 12 15 21 16 19 20 41 30 23 28 35 38 39 47 Anmerkung: Die externen Knoten werden in Zeichnungen oft weggelassen. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 7/41 Rot-Schwarz-Bäume (3) Schwarzhöhe Zeichnet man die roten Knoten immer auf der selben Höhe wie ihren Vater ein, dann erhält man: 17 10 3 7 26 14 12 15 21 16 19 20 41 30 23 28 35 38 39 47 Anmerkung: Die externen Knoten werden in Zeichnungen oft weggelassen. Definition Die Schwarz-Höhe bh(t) eines RBT t ist die Schwarz-Höhe der Wurzel. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 7/41 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öchstens 4bh(t) − 1 innere Knoten. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. Theorem Ein RBT mit n inneren Knoten hat Höhe höchstens 2 log2 (n + 1). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. Theorem Ein RBT mit n inneren Knoten hat Höhe höchstens 2 log2 (n + 1). Ergo: Ein RBT ist ein relativ balancierter BST. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. Theorem Ein RBT mit n inneren Knoten hat Höhe höchstens 2 log2 (n + 1). Ergo: Ein RBT ist ein relativ balancierter BST. Ergo: Suchen benötigt nur Θ(log n) Zeit. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. Theorem Ein RBT mit n inneren Knoten hat Höhe höchstens 2 log2 (n + 1). Ergo: Ein RBT ist ein relativ balancierter BST. Ergo: Suchen benötigt nur Θ(log n) Zeit. Ergo: Für bstMin, bstSucc, etc. gilt dasselbe. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 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öchstens 4bh(t) − 1 innere Knoten. Beweis: Induktion über die Höhe des Baumes. Theorem Ein RBT mit n inneren Knoten hat Höhe höchstens 2 log2 (n + 1). Ergo: Ein RBT ist ein relativ balancierter BST. Ergo: Suchen benötigt nur Θ(log n) Zeit. Ergo: Für bstMin, bstSucc, etc. gilt dasselbe. Mit Einfügen und Löschen werden wir uns noch beschäftigen. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 8/41 Beweisskizze (zum Nachlesen zu Hause) Lemma Es sei x ein Knoten in einem RBT. Dann enthält der Teilbaum mit Wurzel x mindestens 2bh(x ) − 1 innere Knoten. Beweis: Induktion über die Höhe h(x ) des Knotens x . Basis: Wenn h(x ) = 0, dann ist x ein Blatt. Induktionsschritt: Wenn h(x ) ≥ 1, so hat x zwei Kinder yL und yR . Für jedes Kind y von x gilt: h(y ) ≤ h(x ) − 1, und Wenn y rot, dann bh(y ) = bh(x ); andernfalls bh(y ) = bh(x ) − 1 Induktionsannahme liefert: Der Teilbaum mit Wurzel y hat mindestens 2bh(x )−1 − 1 innere Knoten. (Teilbaum mit Wurzel yL ) plus (Teilbaum mit Wurzel yR ) plus (x ) ergibt zusammen mindestens (2bh(x )−1 − 1) + (2bh(x )−1 − 1) + 1 = 2bh(x ) − 1 innere Knoten für den Teilbaum mit Wurzel x . qed DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 9/41 Einfügen in Rot-Schwarz Bäumen DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 10/41 Wiederholung: Einfügen in einen BST / Beispiel Beispiel bstIns(t, Node(18)) 15 5 3 16 12 10 5 20 14 17 3 10 6 VL-11: Rot-Schwarz Bäume 16 12 31 6 DSAL/SS 2017 15 20 14 17 31 18 11/41 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änge den neuen Knoten an. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 12/41 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änge den neuen Knoten an. Es bleibt die Frage nach der Farbe: Färben wir den neuen Knoten schwarz, dann verletzen wir in der Regel die Schwarz-Höhen-Bedingung. Färben wir ihn aber rot, dann könnten wir die Farbbedingungen verletzen (rote Knoten haben keine roten Kinder). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 12/41 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änge den neuen Knoten an. Es bleibt die Frage nach der Farbe: Färben wir den neuen Knoten schwarz, dann verletzen wir in der Regel die Schwarz-Höhen-Bedingung. Färben wir ihn aber rot, dann könnten wir die Farbbedingungen verletzen (rote Knoten haben keine roten Kinder). Wir färben den Knoten daher rot (eine Schwarz-Höhen-Verletzung wäre schwieriger zu behandeln; Rot ist lokale, schwarz ist globale Eigenschaft) Behebe im letzten Schritt die mögliche Farbverletzung. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 12/41 Einfügen in einen RBT: Algorithmus, Teil 1 1 2 3 4 5 6 7 8 9 10 DSAL/SS 2017 void rbtIns ( Tree t , Node node ) { // Fuege node in den Baum t ein bstIns (t , node ) ; // Einfuegen wie beim BST node . left = null ; node . right = null ; node . color = RED ; // eingefuegter Knoten immer zunaechst rot // stelle Rot - Schwarz - Eigenschaft ggf . wieder her rbtInsFix (t , node ) ; } VL-11: Rot-Schwarz Bäume 13/41 Einfügen: Was kann passieren? (1) c c node node node node c c Der neu eingefügte Knoten ist immer rot. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 14/41 Einfügen: Was kann passieren? (1) c c node node node node c c Der neu eingefügte Knoten ist immer rot. Ist Vaterknoten c schwarz, haben wir kein Problem. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 14/41 Einfügen: Was kann passieren? (1) c c node node node node c c Der neu eingefügte Knoten ist immer rot. Ist Vaterknoten c schwarz, haben wir kein Problem. Ist Vaterknoten c aber rot, so liegt eine Rot-Rot-Verletzung vor, die wir behandeln müssen. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 14/41 Einfügen: Was kann passieren? (1) c c node node node node c c Der neu eingefügte Knoten ist immer rot. Ist Vaterknoten c schwarz, haben wir kein Problem. Ist Vaterknoten c aber rot, so liegt eine Rot-Rot-Verletzung vor, 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. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 14/41 Einfügen: Was kann passieren? (2) Wir müssen nun Grossvater d und Onkel e mit berücksichtigen: d c d e c e Der Grossvater des eingefügten Knotens war schwarz, denn es handelte sich vor dem Einfügen um einen korrekten RBT. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 15/41 Einfügen: Was kann passieren? (2) Wir müssen nun Grossvater d und Onkel e mit berücksichtigen: d c d e 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 Onkel e rot, dann stellen wir durch Umfärben von c und e auf schwarz sowie d auf rot die Rot-Schwarz-Eigenschaft lokal wieder her. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 15/41 Einfügen: Was kann passieren? (2) Wir müssen nun Grossvater d und Onkel e mit berücksichtigen: d c d e 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 Onkel e rot, dann stellen wir durch Umfärben von c und e auf schwarz sowie d auf rot die Rot-Schwarz-Eigenschaft lokal wieder her. Zwei Ebenen weiter oben kann nun eine Rot-Rot-Verletzung vorliegen, die nach selben Schema iterativ aufgelöst wird. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 15/41 Einfügen: Was kann passieren? (2) Wir müssen nun Grossvater d und Onkel e mit berücksichtigen: d c d e 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 Onkel e rot, dann stellen wir durch Umfärben von c und e auf schwarz sowie d auf rot die Rot-Schwarz-Eigenschaft lokal wieder her. Zwei Ebenen weiter oben kann nun eine Rot-Rot-Verletzung vorliegen, die nach selben Schema iterativ aufgelöst wird. Ist d allerdings die Wurzel, dann färben wir sie einfach wieder schwarz. Dadurch erhöht sich die Schwarzhöhe des Baumes um 1. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 15/41 Einfügen: Was kann passieren? (3) Ist der Onkel e dagegen schwarz, so erhalten wir Fall 2 und Fall 3: d c d e c Fall 2 DSAL/SS 2017 e Fall 3 VL-11: Rot-Schwarz Bäume 16/41 Einfügen: Was kann passieren? (3) Ist der Onkel e dagegen schwarz, so erhalten wir Fall 2 und Fall 3: d c d e c Fall 2 e Fall 3 Fall 2 Dieser Fall lässt sich durch Linksrotation um c auf Fall 3 reduzieren. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 16/41 Einfügen: Was kann passieren? (3) Ist der Onkel e dagegen schwarz, so erhalten wir Fall 2 und Fall 3: d c d e c Fall 2 e Fall 3 Fall 2 Dieser Fall lässt sich durch Linksrotation um c auf Fall 3 reduzieren. Schwarz-Höhe des linken Teilbaumes von d ändert das nicht. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 16/41 Einfügen: Was kann passieren? (3) Ist der Onkel e dagegen schwarz, so erhalten wir Fall 2 und Fall 3: d c d e c Fall 2 e Fall 3 Fall 2 Dieser Fall lässt sich durch Linksrotation um c auf Fall 3 reduzieren. Schwarz-Höhe des linken Teilbaumes von d ändert das nicht. Der bisherige Vaterknoten c wird dabei zum linken, roten Kind, das eine Rot-Rot-Verletzung mit dem neuen Vater (c im rechten Bild) hat. Diese Verletzung wird wie im Fall 3 behoben. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 16/41 Einfügen: Was kann passieren? (4) bh(·) = x + 1 d x x c e x Fall 3 Zunächst rotieren wir um d nach rechts, wobei wir die Schwarz-Höhen im Auge behalten. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 17/41 Einfügen: Was kann passieren? (4) bh(·) = x + 1 bh(·) = ??? c d x x c e −→ x x x +1 d x x e 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 von c wieder in Einklang zu bringen, färben wir Knoten d rot. Da dessen nun linkes Kind ursprünglich am roten c hing, ist das unproblematisch. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 17/41 Einfügen: Was kann passieren? (4) bh(·) = x + 1 bh(·) = x c d x x c e −→ x x x d x x e 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 von c wieder in Einklang zu bringen, färben wir Knoten d rot. Da dessen nun linkes Kind ursprünglich am roten c hing, ist das unproblematisch. Schlussendlich färben wir c schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 17/41 Einfügen: Was kann passieren? (4) bh(·) = x + 1 bh(·) = x + 1 c d x x c e −→ x x x d x x e 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 von c wieder in Einklang zu bringen, färben wir Knoten d rot. Da dessen nun linkes Kind ursprünglich am roten c hing, ist das unproblematisch. Schlussendlich färben wir c schwarz. Wir haben wieder einen gültigen RBT, mit unveränderter Schwarzhöhe des Gesamtbaumes. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 17/41 Einfügen in einen RBT: Algorithmus, Teil 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DSAL/SS 2017 // Behebe eventuelle Rot - Rot - Verletzung mit Vater // Knoten node ist rot void rbtInsFix ( Tree t , Node node ) { // solange noch eine Rot - Rot - Verletzung besteht while ( node . parent . color == RED ) { if ( node . parent == node . parent . parent . left ) { // der von uns betrachtete Fall node = leftAdjust (t , node ) ; // node jetzt weiter oben ? // ( node = node . parent . parent im Fall 1 von leftAdjust ) } else { // der dazu symmetrischer Fall node = rightAdjust (t , node ) ; } } t . root . color = BLACK ; // Wurzel bleibt schwarz } VL-11: Rot-Schwarz Bäume 18/41 Einfügen in einen RBT: Algorithmus Teil 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 DSAL/SS 2017 Node leftAdjust ( Tree t , Node node ) { Node uncle = node . parent . parent . right ; if ( uncle . color == RED ) { // Fall 1 node . parent . parent . color = RED ; // Grossvater node . parent . color = BLACK ; // Vater uncle . color = BLACK ; // Onkel return node . parent . parent ; // pruefe Rot - Rot weiter oben } else { // Fall 2 und 3 if ( node == node . parent . right ) { // Fall 2 // dieser Knoten wird das linke , rote Kind : node = node . parent ; leftRotate (t , node ) ; } // Fall 3 rightRotate (t , node . parent . parent ) ; node . parent . color = BLACK ; node . parent . right . color = RED ; return node ; // fertig , node . parent . color == BLACK } } VL-11: Rot-Schwarz Bäume 19/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). Die Schleife in rbtInsFix wird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeiger node zwei Ebenen im Baum auf. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). Die Schleife in rbtInsFix wird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeiger node zwei Ebenen im Baum auf. Die maximal Anzahl der Schleifen ist damit O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). Die Schleife in rbtInsFix wird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeiger node zwei Ebenen im Baum auf. Die maximal Anzahl der Schleifen ist damit O(log n). 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.) DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). Die Schleife in rbtInsFix wird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeiger node zwei Ebenen im Baum auf. Die maximal Anzahl der Schleifen ist damit O(log n). 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 in O(1). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Einfügen in einen RBT: Analyse Zeitkomplexität Einfügen Die Worst-Case Laufzeit von rbtIns für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Worst-Case Laufzeit von bstIns ist O(log n). Die Schleife in rbtInsFix wird nur wiederholt wenn Fall 1 auftrittt. Dann steigt der Zeiger node zwei Ebenen im Baum auf. Die maximal Anzahl der Schleifen ist damit O(log n). 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 in O(1). Somit benötigt rbtIns eine Gesamtzeit O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 20/41 Löschen in Rot-Schwarz Bäumen DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 21/41 Wiederholung: Löschen im BST / Strategie Löschen Um Knoten node aus dem BST zu löschen, verfahren wir folgendermassen: Fall 1: node hat keine Kinder: Ersetze im Vaterknoten von node den Zeiger auf node durch null Fall 2: node hat ein Kind: Wir schneiden node aus, indem wir den Vater und das Kind direkt miteinander verbinden (den Teilbaum ersetzen). Fall 3: node hat zwei Kinder: Wir finden den Nachfolger von node, entfernen ihn aus seiner ursprünglichen Position und tauschen node gegen den Nachfolger. Anmerkung: Der Nachfolger hat höchstens ein Kind. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 22/41 Wiederholung: Löschen im BST / (k)ein Kind 15 15 10 17 14 6 15 15 5 16 5 20 12 10 14 17 20 12 3 31 10 14 17 31 6 6 DSAL/SS 2017 31 17 10 31 6 3 20 12 3 20 12 3 16 5 16 5 VL-11: Rot-Schwarz Bäume 23/41 Wiederholung: Löschen im BST / zwei Kinder 6 15 20 12 10 14 16 5 16 5 3 15 31 17 20 12 3 14 10 17 31 6 15 6 3 16 10 DSAL/SS 2017 20 12 14 VL-11: Rot-Schwarz Bäume 17 31 24/41 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: DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 25/41 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 einen roten Knoten, bleibt alles beim alten: 1 DSAL/SS 2017 Im Baum werden keine Schwarzhöhen geändert VL-11: Rot-Schwarz Bäume 25/41 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 einen roten Knoten, bleibt alles beim alten: 1 Im Baum werden keine Schwarzhöhen geändert 2 Es entstehen keine benachbarten roten Knoten DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 25/41 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 einen roten Knoten, bleibt alles beim alten: 1 Im Baum werden keine Schwarzhöhen geändert 2 Es entstehen keine benachbarten roten Knoten 3 Die Wurzel bleibt schwarz. Dieser Fall ist harmlos. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 25/41 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 einen roten Knoten, bleibt alles beim alten: 1 Im Baum werden keine Schwarzhöhen geändert 2 Es entstehen keine benachbarten roten 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. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 25/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 DSAL/SS 2017 Wir finden den Nachfolger von node VL-11: Rot-Schwarz Bäume 26/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 Wir finden den Nachfolger von node 2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur rbtDel) aus seiner ursprünglichen Position DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 26/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 Wir finden den Nachfolger von node 2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur rbtDel) aus seiner ursprünglichen Position 3 Wir beheben dabei die möglich auftretende Farbverletzung DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 26/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 Wir finden den Nachfolger von node 2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur rbtDel) aus seiner ursprünglichen Position 3 Wir beheben dabei die möglich auftretende Farbverletzung 4 Wir ersetzen node durch den Nachfolger, und DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 26/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 Wir finden den Nachfolger von node 2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur rbtDel) aus seiner ursprünglichen Position 3 Wir beheben dabei die möglich auftretende Farbverletzung 4 Wir ersetzen node durch den Nachfolger, und 5 übernehmen dabei die möglicherweise neue Farbe von node. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 26/41 Löschen im RBT: Strategie (2) Löschen Für den Fall, dass node zwei Kinder hat: 1 Wir finden den Nachfolger von node 2 Wir entfernen den Nachfolger (mittels unserer alten Prozedur rbtDel) aus seiner ursprünglichen Position 3 Wir beheben dabei die möglich auftretende Farbverletzung 4 Wir ersetzen node durch den Nachfolger, und 5 übernehmen dabei die möglicherweise neue Farbe von node. Der Baum bleibt ein gültiger RBT. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 26/41 Wiederholung: Löschen im BST / Algorithmus (VL-10) 1 2 3 4 5 6 7 8 9 10 11 12 13 DSAL/SS 2017 // Entfernt node aus dem Baum . // Danach kann node ggf . aus Speicher entfernt werden void bstDel ( Tree t , Node node ) { if ( node . left && node . right ) { // zwei Kinder Node tmp = bstMin ( node . right ) ; // finde Nachfolger bstDel (t , tmp ) ; // loesche Nachfolger bstSwap (t , node , tmp ) ; } else if ( node . left ) { // ein Kind , links bstReplace (t , node , node . left ) ; } else { // ein oder kein Kind ( node . right == null ) bstReplace (t , node , node . right ) ; } } VL-11: Rot-Schwarz Bäume 27/41 Wiederholung: Löschen im BST / Variante von VL-10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 DSAL/SS 2017 // Entfernt node aus dem Baum . // Danach kann node ggf . aus Speicher entfernt werden void bstDel ( Tree t , Node node ) { if ( node . left && node . right ) { // zwei Kinder Node tmp = bstMin ( node . right ) ; // finde Nachfolger bstDel (t , tmp ) ; // loesche Nachfolger bstSwap (t , node , tmp ) ; } else { // ein Kind , oder kein Kind Node child ; // Hilfsvariable if ( node . left ) child = node . left ; // Kind ist links else if ( node . right ) child = node . right ; // rechts else child = null ; // kein Kind bstReplace (t , node , child ) ; } } VL-11: Rot-Schwarz Bäume 28/41 Löschen im RBT: Algorithmus, Teil 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DSAL/SS 2017 // Entfernt node aus dem Baum . void rbtDel ( Tree t , Node node ) { if ( node . left && node . right ) { // zwei Kinder Node tmp = bstMin ( node . right ) ; // finde Nachfolger rbtDel (t , tmp ) ; // loesche Nachfolger bstSwap (t , node , tmp ) ; // ersetze node durch Nfolger tmp . color = node . color ; // uebernimm die Farbe } else { // ein Kind , oder kein Kind Node child ; // Hilfsvariable if ( node . left ) child = node . left ; // Kind ist links else if ( node . right ) child = node . right ; // rechts else child = null ; // kein Kind rbtDelFix (t , node , child ) ; bstReplace (t , node , child ) ; } } VL-11: Rot-Schwarz Bäume 29/41 Löschen im RBT: Beispiel 1 rbtDel(t, 35) 23 13 7 30 18 17 23 28 13 35 7 38 30 18 28 38 17 Wie beim BST tritt der rechte Teilbaum von 35 an dessen Stelle. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 30/41 Löschen im RBT: Beispiel 1 rbtDel(t, 35) 23 13 7 30 18 17 23 28 13 35 7 38 30 18 28 38 17 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). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 30/41 Löschen im RBT: Beispiel 1 rbtDel(t, 35) 23 13 7 30 18 17 23 28 13 35 7 38 30 18 28 38 17 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“. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 30/41 Löschen im RBT – Beispiel 2 rbtDel(t, 30) 23 13 7 30 18 28 23 13 2. 35 7 30 18 28 35 38 1. 17 38 17 Da Knoten 30 zwei Kinder hat, finden wir zuerst den Nachfolger. Lösche 35 derart, dass die RBT-Eigenschaft erhalten bleibt (siehe voriges Beispiel). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 31/41 Löschen im RBT – Beispiel 2 rbtDel(t, 30) 23 13 7 30 18 28 23 13 2. 35 7 30 18 28 35 38 1. 17 38 17 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. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 31/41 Löschen im RBT – Beispiel 2 rbtDel(t, 30) 23 13 7 30 18 17 23 28 13 35 7 38 35 18 28 30 38 17 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. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 31/41 Löschen im RBT: Algorithmus, Teil 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 DSAL/SS 2017 // node soll geloescht werden , child ist einziges Kind // ( bzw . node hat keine Kinder , und child == null ) ; // Ist node rot , so ist nichts zu tun ; sonst suchen wir // einen roten Knoten , der durch Umfaerben auf schwarz // die schwarze Farbe von node uebernimmt void rbtDelFix ( Tree t , Node node , Node child ) { if ( node . color == RED ) return ; if ( child != null && child . color == RED ) { child . color = BLACK ; } else { Node searchPos = node ; // solange Schwarzwert nicht eingefuegt werden kann while ( searchPos . parent && searchPos . color == BLACK ) { if ( searchPos == searchPos . parent . left ) // linkes Kind searchPos = delLeftAdjust (t , searchPos ) ; else // rechtes Kind searchPos = delRight Adjust (t , searchPos ) ; } searchPos . color = BLACK ; } } VL-11: Rot-Schwarz Bäume 32/41 Löschen im RBT: Algorithmus, Teil 3a 1 2 3 4 5 6 7 8 9 10 11 12 → DSAL/SS 2017 // Erleichtert node um einen Schwarzwert , // wobei node das linke Kind ist . Node delLeftAdjust ( Tree t , Node node ) { // brother existiert immer wegen Schwarzhoehe Node brother = node . parent . right ; if ( brother . color == RED ) { // Fall 1: Reduktion auf 2 ,3 ,4 brother . color = BLACK ; node . parent . color = RED ; // Vater leftRotate (t , node . parent ) ; brother = node . parent . right ; // nun Bruder von node } wird auf nächster Seite fortgesetzt VL-11: Rot-Schwarz Bäume 33/41 Löschen im RBT: Algorithmus, Teil 3b 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 DSAL/SS 2017 if ( brother . left . color == BLACK && brother . right . color == BLACK ) { // Fall 2 brother . color = RED ; return node . parent ; // Doppel - schwarz weiter oben ... } else { // Fall 3 und 4 if ( brother . right . color == BLACK ) // Fall 3 brother . left . color = BLACK ; brother . color = RED ; rightRotate (t , brother ) ; brother = node . parent . right ; // nun Bruder von node } // Fall 4 brother . color = node . parent . color ; node . parent . color = BLACK ; brother . right . color = BLACK ; leftRotate (t , node . parent ) ; return t . root ; // Fertig . } } VL-11: Rot-Schwarz Bäume 34/41 Der Löschalgorithmus: Fall 1 Fall 1: (Reduktion auf Fall 2, 3 oder 4) −→ sPos −→ brother sPos DSAL/SS 2017 VL-11: Rot-Schwarz Bäume neuer brother 35/41 Der Löschalgorithmus: Fall 2 Fall 2: −→ c sPos DSAL/SS 2017 neuer sPos c brother VL-11: Rot-Schwarz Bäume 36/41 Der Löschalgorithmus: Fall 3 Fall 3: (Reduktion auf Fall 4) −→ c sPos DSAL/SS 2017 −→ c brother VL-11: Rot-Schwarz Bäume c sPos neuer brother 37/41 Der Löschalgorithmus: Fall 4 Fall 4: −→ −→ c c brother sPos c d DSAL/SS 2017 d VL-11: Rot-Schwarz Bäume d 38/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Laufzeit von rbtDel ohne Aufrufe von rbtDelFix ist O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Laufzeit von rbtDel ohne Aufrufe von rbtDelFix ist O(log n). Die Fälle 2, 3, und 4 brauchen höchstens drei Rotationen und eine konstante Anzahl Farbänderungen. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Laufzeit von rbtDel ohne Aufrufe von rbtDelFix ist O(log n). Die Fälle 2, 3, und 4 brauchen höchstens drei Rotationen und eine konstante Anzahl Farbänderungen. Die Schleife in rbtDelFix wird nur wiederholt wenn Fall 2 auftrittt. Dann steigt der Zeiger node eine Ebene im Baum hinauf. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Laufzeit von rbtDel ohne Aufrufe von rbtDelFix ist O(log n). Die Fälle 2, 3, und 4 brauchen höchstens drei Rotationen und eine konstante Anzahl Farbänderungen. Die Schleife in rbtDelFix wird nur wiederholt wenn Fall 2 auftrittt. Dann steigt der Zeiger node eine Ebene im Baum hinauf. Die maximale Anzahl der Schleifen ist damit O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Löschen im RBT: Analyse Zeitkomplexität Löschen Die Worst-Case Laufzeit von rbtDel für einen Rot-Schwarz-Baum mit n inneren Knoten ist O(log n). Beweisskizze: Die Laufzeit von rbtDel ohne Aufrufe von rbtDelFix ist O(log n). Die Fälle 2, 3, und 4 brauchen höchstens drei Rotationen und eine konstante Anzahl Farbänderungen. Die Schleife in rbtDelFix wird nur wiederholt wenn Fall 2 auftrittt. Dann steigt der Zeiger node eine Ebene im Baum hinauf. Die maximale Anzahl der Schleifen ist damit O(log n). Somit benötigt rbtDel eine Gesamtzeit O(log n). DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 39/41 Komplexität der RBT-Operationen Operation bstSearch bstSucc bstMin bstIns bstDel DSAL/SS 2017 Zeit Θ(h) Θ(h) Θ(h) Θ(h) Θ(h) Operation rbtIns rbtDel Zeit Θ(log n) Θ(log n) Alle anderen Operationen wie beim BST, wobei h = log n. VL-11: Rot-Schwarz Bäume 40/41 Komplexität der RBT-Operationen Operation bstSearch bstSucc bstMin bstIns bstDel Zeit Θ(h) Θ(h) Θ(h) Θ(h) Θ(h) Operation rbtIns rbtDel Zeit Θ(log n) Θ(log n) Alle anderen Operationen wie beim BST, wobei h = log n. Zusammengefasst: Die Laufzeit für alle Operationen ist logarithmisch in der Grösse des Rot-Schwarz-Baumes. DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 40/41 Organisatorisches • Nächste Vorlesung: Dienstag, Mai 30, 16:15–17:45 Uhr, Aula 1 (Mai 25 = Feiertag; keine Vorlesung) • Webseite: http://algo.rwth-aachen.de/Lehre/SS17/DSA.php DSAL/SS 2017 VL-11: Rot-Schwarz Bäume 41/41