Algorithmen und Datenstrukturen 7. Vorlesung Martin Dietzfelbinger 26. Mai 2008 FG KTuEA, TU Ilmenau AuD – 26.05.2008 AVL-Bäume [Adelson-Velskii und Landis 1962] FG KTuEA, TU Ilmenau AuD – 26.05.2008 1 AVL-Bäume [Adelson-Velskii und Landis 1962] Höhenbalancierte binäre Suchbäume FG KTuEA, TU Ilmenau AuD – 26.05.2008 1 AVL-Bäume [Adelson-Velskii und Landis 1962] Höhenbalancierte binäre Suchbäume T: v d1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 d Tv ,1 Tv ,2 2 1 AVL-Bäume [Adelson-Velskii und Landis 1962] Höhenbalancierte binäre Suchbäume T: v d1 d Tv ,1 Tv ,2 2 d2 − d1 ∈ {−1, 0, 1}. FG KTuEA, TU Ilmenau AuD – 26.05.2008 1 Definition Ein binärer Suchbaum T heißt AVL-Baum, FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt: FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt: d(Tv,2) − d(Tv,1) | {z } ∈ {−1, 0, 1} . Balancefaktor in v“ ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt: d(Tv,2) − d(Tv,1) | {z } ∈ {−1, 0, 1} . Balancefaktor in v“ ” Satz FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 Definition Ein binärer Suchbaum T heißt AVL-Baum, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt: d(Tv,2) − d(Tv,1) | {z } ∈ {−1, 0, 1} . Balancefaktor in v“ ” Satz Ist T ein höhenbalancierter Baum mit n Knoten, so gilt d(T ) ≤ 1,4405 · log2 n. FG KTuEA, TU Ilmenau AuD – 26.05.2008 2 AVL-Bäume: höhenbalancierte binäre Suchbäume. FG KTuEA, TU Ilmenau AuD – 26.05.2008 3 AVL-Bäume: höhenbalancierte binäre Suchbäume. Müssen noch zeigen: Man kann die Wörterbuchoperationen so implementieren, FG KTuEA, TU Ilmenau AuD – 26.05.2008 3 AVL-Bäume: höhenbalancierte binäre Suchbäume. Müssen noch zeigen: Man kann die Wörterbuchoperationen so implementieren, dass die AVL-Eigenschaft erhalten bleibt, FG KTuEA, TU Ilmenau AuD – 26.05.2008 3 AVL-Bäume: höhenbalancierte binäre Suchbäume. Müssen noch zeigen: Man kann die Wörterbuchoperationen so implementieren, dass die AVL-Eigenschaft erhalten bleibt, und der Zeitbedarf proportional zur Tiefe ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 3 AVL-Bäume: höhenbalancierte binäre Suchbäume. Müssen noch zeigen: Man kann die Wörterbuchoperationen so implementieren, dass die AVL-Eigenschaft erhalten bleibt, und der Zeitbedarf proportional zur Tiefe ist. Knotenformat: x : key r : data left bal: Z FG KTuEA, TU Ilmenau right AuD – 26.05.2008 3 AVL-Bäume: höhenbalancierte binäre Suchbäume. Müssen noch zeigen: Man kann die Wörterbuchoperationen so implementieren, dass die AVL-Eigenschaft erhalten bleibt, und der Zeitbedarf proportional zur Tiefe ist. Knotenformat: x : key r : data left bal: Z FG KTuEA, TU Ilmenau right AuD – 26.05.2008 x: key; r: data; bal: integer; (∗ Legal: {−1, 0, 1} ∗) left, right: AVL Tree (∗ Zeiger auf Baumknoten ∗) 3 Implementierung der Operationen FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. Brauchen nur: FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. Brauchen nur: AVL insert(T, x, r) und AVL delete(x). FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. Brauchen nur: AVL insert(T, x, r) und AVL delete(x). Grundansatz: Führe Update-Operation aus wie bei gewöhnlichem BSB. FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. Brauchen nur: AVL insert(T, x, r) und AVL delete(x). Grundansatz: Führe Update-Operation aus wie bei gewöhnlichem BSB. Eventuell wird dadurch Bedingung Höhenbalancierung“ ” verletzt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Implementierung der Operationen AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem BSB.) AVL lookup: Wie bei gewöhnlichem BSB. Brauchen nur: AVL insert(T, x, r) und AVL delete(x). Grundansatz: Führe Update-Operation aus wie bei gewöhnlichem BSB. Eventuell wird dadurch Bedingung Höhenbalancierung“ ” verletzt. Reparatur“: Rebalancierung, erfolgt rekursiv. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 4 Rotationen: Hilfsoperationen Rechtsrotation: kippe 1 Kante nach rechts“: ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 5 Rotationen: Hilfsoperationen Rechtsrotation: kippe 1 Kante nach rechts“: ” u v liefert: v u FG KTuEA, TU Ilmenau AuD – 26.05.2008 5 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 FG KTuEA, TU Ilmenau v 3 T1 T2 AuD – 26.05.2008 y T3 T2 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 y v 3 T1 T2 T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 y v 3 T1 T2 T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. Denn: Weil Tv binärer Suchbaum ist, FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 y v 3 T1 T2 T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. Denn: Weil Tv binärer Suchbaum ist, gilt für v1 in T1, v2 in T2, v3 in T3: FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 y v 3 T1 T2 T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. Denn: Weil Tv binärer Suchbaum ist, gilt für v1 in T1, v2 in T2, v3 in T3: key(v1) < x < key(v2) < y < key(v3). FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 y v 3 T1 T2 T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. Denn: Weil Tv binärer Suchbaum ist, gilt für v1 in T1, v2 in T2, v3 in T3: key(v1) < x < key(v2) < y < key(v3). Also ist die Suchbaumeigenschaft auch in Tu0 erfüllt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 6 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen FG KTuEA, TU Ilmenau AuD – 26.05.2008 7 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 FG KTuEA, TU Ilmenau v 3 T1 T2 AuD – 26.05.2008 y T3 T2 7 Rotationen: Hilfsoperationen Rechtsrotation: Mit Unterbäumen Tv : y v Tu ’: 1 x u 3 u 1 x 2 2 T3 T1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 v 3 T1 T2 Beim Umbau ändert sich nur: y T3 T2 – rechtes Kind von u – linkes Kind von v 7 Rechtsrotation als Programm: FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) (3) u ← v.left ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) (3) u ← v.left ; (4) v.left ← u.right ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) (3) u ← v.left ; (4) v.left ← u.right ; (5) u.right ← v ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) (3) u ← v.left ; (4) v.left ← u.right ; (5) u.right ← v ; (6) return u . FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Rechtsrotation als Programm: Prozedur rotateR(v : AVL Tree) (1) (∗ v 6= NULL, v.left 6= NULL ∗) (2) u : AVL Tree ; (∗ Hilfsvariable ∗) (3) u ← v.left ; (4) v.left ← u.right ; (5) u.right ← v ; (6) return u . Achtung: Balancefaktoren in den zwei beteiligten Knoten sind nun inkorrekt! FG KTuEA, TU Ilmenau AuD – 26.05.2008 8 Linksrotation: Umkehrung von Rechtsrotation FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 Linksrotation: Umkehrung von Rechtsrotation, Implementierung analog. FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 Linksrotation: Umkehrung von Rechtsrotation, Implementierung analog. x y y T1 x T2 T2 T3 T3 T1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 Linksrotation: Umkehrung von Rechtsrotation, Implementierung analog. x y y T1 x T2 T2 T3 T3 T1 In den folgenden Beispielen: FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 Linksrotation: Umkehrung von Rechtsrotation, Implementierung analog. x y y T1 x T2 T2 T3 T3 T1 In den folgenden Beispielen: Nummern bezeichnen Anschlussstellen für die drei Unterbäume. FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 v c u 1 b rotateR 3 d 2 u 1 b a 2 rotateL a d v c 3 rotateR 1 a u u d a 1 2 2 rotateL b v c d u d 3 u 1 b rotateR v a b 2 1 a 3 b v FG KTuEA, TU Ilmenau v c 3 c AuD – 26.05.2008 rotateL 2 d 3 c 10 Doppelrotationen: Links-Rechts, Rechts-Links FG KTuEA, TU Ilmenau AuD – 26.05.2008 11 Doppelrotationen: Links-Rechts, Rechts-Links Beispiel: Links-Rechts-Doppelrotation FG KTuEA, TU Ilmenau AuD – 26.05.2008 11 Doppelrotationen: Links-Rechts, Rechts-Links Beispiel: Links-Rechts-Doppelrotation z v z u x w y w y FG KTuEA, TU Ilmenau links an u u x AuD – 26.05.2008 v rechts an v y u x w v z 11 Doppelrotationen: Links-Rechts, Rechts-Links Beispiel: Links-Rechts-Doppelrotation z v z u x w y w y links an u u x v rechts an v y u x w v z Anzuwenden auf Zick-Zack-Weg aus zwei Kanten, Form links-rechts“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 11 Links-Rechts-Doppelrotation: Mit Unterbäumen FG KTuEA, TU Ilmenau AuD – 26.05.2008 12 Links-Rechts-Doppelrotation: Mit Unterbäumen v z 4 y u x 1 w y 3 2 u 1 x T1 T1 T2 FG KTuEA, TU Ilmenau v z 2 T4 w T2 3 4 T3 T4 T3 AuD – 26.05.2008 12 Links-Rechts-Doppelrotation: Mit Unterbäumen v z 4 y u x 1 w y 3 2 u 1 x T1 T1 T2 v z 2 T4 w T2 3 4 T3 T4 T3 Gesamteffekt: Der unterste Knoten w des Zick-Zack-Wegs ( links-rechts“) wandert nach oben, wird Wurzel; ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 12 Links-Rechts-Doppelrotation: Mit Unterbäumen v z 4 y u x 1 w y 3 2 u 1 x T1 T1 T2 v z 2 T4 w T2 3 4 T3 T4 T3 Gesamteffekt: Der unterste Knoten w des Zick-Zack-Wegs ( links-rechts“) wandert nach oben, wird Wurzel; die beiden ” anderen Knoten u und v werden linkes und rechtes Kind. FG KTuEA, TU Ilmenau AuD – 26.05.2008 12 LR-Doppelrotation als Programm FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; (7) v.left ← w.right ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; (7) v.left ← w.right ; (8) w.left ← u ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; (7) v.left ← w.right ; (8) w.left ← u ; (9) w.right ← v ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; (7) v.left ← w.right ; (8) w.left ← u ; (9) w.right ← v ; (10) return w . FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 LR-Doppelrotation als Programm Prozedur rotateLR(v : AVL Tree) (1) (∗ Eingabe: v 6= NULL (2) v.left 6= NULL, v.left.right 6= NULL ∗) (3) u, w : AVL Tree ; (4) u ← v.left ; (5) w ← u.right ; (6) u.right ← w.left ; (7) v.left ← w.right ; (8) w.left ← u ; (9) w.right ← v ; (10) return w . Achtung: Balancefaktoren in den drei beteiligten Knoten sind nun inkorrekt! FG KTuEA, TU Ilmenau AuD – 26.05.2008 13 Rechts-Links-Doppelrotation: Symmetrisch zu Links-Rechts-Doppelrotation FG KTuEA, TU Ilmenau AuD – 26.05.2008 14 Rechts-Links-Doppelrotation: Symmetrisch zu Links-Rechts-Doppelrotation v 1 x y u z w y T1 2 w u v 4 1 z x 2 3 4 3 T4 T2 FG KTuEA, TU Ilmenau T3 AuD – 26.05.2008 T1 T2 T3 T4 14 Beispiel: FG KTuEA, TU Ilmenau AuD – 26.05.2008 15 Beispiel: 1 D links A P 2 B links− rechts P F S D 3 S 4 F A R T A T S 1 B 2 1 R P 3 D T R B 2 3 F rechts D B 1 A rechts− links P B AuD – 26.05.2008 P 4 S F 2 R FG KTuEA, TU Ilmenau A T D S 3 F R T 15 AVL insert(T,x,r) FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. Wenn Balancebedingung nirgendwo verletzt: fertig. FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. Wenn Balancebedingung nirgendwo verletzt: fertig. Wenn Balancebedingung irgendwo verletzt, gibt es auf dem Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v, FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. Wenn Balancebedingung nirgendwo verletzt: fertig. Wenn Balancebedingung irgendwo verletzt, gibt es auf dem Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v, an dem die Balancebedingung nicht erfüllt ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. Wenn Balancebedingung nirgendwo verletzt: fertig. Wenn Balancebedingung irgendwo verletzt, gibt es auf dem Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v, an dem die Balancebedingung nicht erfüllt ist. An v wird eine Einfach- oder Doppelrotation ausgeführt FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 AVL insert(T,x,r) Gesamteffekt: Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten. Wenn Balancebedingung nirgendwo verletzt: fertig. Wenn Balancebedingung irgendwo verletzt, gibt es auf dem Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v, an dem die Balancebedingung nicht erfüllt ist. An v wird eine Einfach- oder Doppelrotation ausgeführt und dadurch die Balancebedingung wieder hergestellt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 16 Beispiel: Einfügen von 1, 3, 9, 11, 12, 10, 2, 6, 4, 7, 0 in anfangs leeren AVL-Baum. Wir zeichnen nur Situationen, in denen Rotationen stattfinden. FG KTuEA, TU Ilmenau AuD – 26.05.2008 17 Beispiel: Einfügen von 1, 3, 9, 11, 12, 10, 2, 6, 4, 7, 0 in anfangs leeren AVL-Baum. Wir zeichnen nur Situationen, in denen Rotationen stattfinden. 1 links 3 1 3 9 links 11 9 11 12 FG KTuEA, TU Ilmenau AuD – 26.05.2008 11 1 12 9 12 1 3 9 rechts−links 3 10 9 10 17 rechts− links 3 11 1 12 9 9 links− rechts 3 11 10 12 10 1 2 2 9 9 2 links 4 1 3 7 FG KTuEA, TU Ilmenau 11 10 11 2 12 1 6 rechts− links 10 3 12 6 7 AuD – 26.05.2008 6 4 4 18 rechts 9 2 links 11 4 1 3 10 9 11 4 12 2 6 1 7 6 3 12 10 7 0 0 4 2 1 0 FG KTuEA, TU Ilmenau AuD – 26.05.2008 9 3 11 6 7 10 12 19 Etwas knifflig: Rekursive Programmierung des Ablaufs. FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Etwas knifflig: Rekursive Programmierung des Ablaufs. Kann/will nicht verwenden: Globale Sicht“, Vergleichen von ” Tiefen durch Hinschauen“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Etwas knifflig: Rekursive Programmierung des Ablaufs. Kann/will nicht verwenden: Globale Sicht“, Vergleichen von ” Tiefen durch Hinschauen“. ” Benutzt werden: FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Etwas knifflig: Rekursive Programmierung des Ablaufs. Kann/will nicht verwenden: Globale Sicht“, Vergleichen von ” Tiefen durch Hinschauen“. ” Benutzt werden: • Balancefaktoren T.bal in den Knoten, FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Etwas knifflig: Rekursive Programmierung des Ablaufs. Kann/will nicht verwenden: Globale Sicht“, Vergleichen von ” Tiefen durch Hinschauen“. ” Benutzt werden: • Balancefaktoren T.bal in den Knoten, • Flagbit deeper“, das als Resultat eines rekursiven Aufrufs ” mitteilt, ob der bearbeitete Unterbaum tiefer geworden ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Etwas knifflig: Rekursive Programmierung des Ablaufs. Kann/will nicht verwenden: Globale Sicht“, Vergleichen von ” Tiefen durch Hinschauen“. ” Benutzt werden: • Balancefaktoren T.bal in den Knoten, • Flagbit deeper“, das als Resultat eines rekursiven Aufrufs ” mitteilt, ob der bearbeitete Unterbaum tiefer geworden ist. Steuerung einer großen Fallunterscheidung durch alte Balancefaktoren und deeper“-Meldungen aus rekursivem Aufruf. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 20 Prozedur AVL insert(T,x,r) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) 1. Fall: T = NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) (4) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) (4) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) (5) T.key ← x ; (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) (4) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) (5) T.key ← x ; (6) T.data ← r ; (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) (4) (5) (6) (7) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) T.key ← x ; T.data ← r ; T.left ← NULL ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) (4) (5) (6) (7) (8) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) T.key ← x ; T.data ← r ; T.left ← NULL ; T.right ← NULL; FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) (4) (5) (6) (7) (8) (9) (10) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) T.key ← x ; T.data ← r ; T.left ← NULL ; T.right ← NULL; T.bal ← 0 ; return (T, true) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 Prozedur AVL insert(T,x,r) (1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗) (2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗) (3) (4) (5) (6) (7) (8) (9) (10) (11) 1. Fall: T = NULL (∗ Neuer Knoten! ∗) T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗) T.key ← x ; T.data ← r ; T.left ← NULL ; T.right ← NULL; T.bal ← 0 ; return (T, true) . (∗ Baumhöhe hat sich von −1 auf 0 erhöht. ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 21 (12) 2. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (∗ Update-Situation! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (∗ Update-Situation! ∗) T.data ← r ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (∗ Update-Situation! ∗) T.data ← r ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. (18) (T.left, left deeper) ← AVL insert(T.left, x, r) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. (18) (19) (T.left, left deeper) ← AVL insert(T.left, x, r) ; (∗ Rekursives Einfügen in linken Unterbaum ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. (18) (19) (20) (T.left, left deeper) ← AVL insert(T.left, x, r) ; (∗ Rekursives Einfügen in linken Unterbaum ∗) (T, deeper) ← RebalanceInsLeft(T,left deeper) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. (18) (19) (20) (21) (T.left, left deeper) ← AVL insert(T.left, x, r) ; (∗ Rekursives Einfügen in linken Unterbaum ∗) (T, deeper) ← RebalanceInsLeft(T,left deeper) ; (∗ Rebalancierung in der Wurzel von T, s. unten ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (12) 2. Fall: T 6= NULL and T.key = x. (13) (14) (15) (16) (∗ Update-Situation! ∗) T.data ← r ; return (T, false) . (∗ Baumstruktur nicht verändert. ∗) (17) 3. Fall: T 6= NULL and x < T.key. (18) (19) (20) (21) (22) (T.left, left deeper) ← AVL insert(T.left, x, r) ; (∗ Rekursives Einfügen in linken Unterbaum ∗) (T, deeper) ← RebalanceInsLeft(T,left deeper) ; (∗ Rebalancierung in der Wurzel von T, s. unten ∗) return (T, deeper) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 22 (23) 4. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (T.right, right deeper) ← AVL insert(T.right, x, r) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (25) (T.right, right deeper) ← AVL insert(T.right, x, r) ; (∗ Rekursives Einfügen in rechten Unterbaum ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (25) (26) (T.right, right deeper) ← AVL insert(T.right, x, r) ; (∗ Rekursives Einfügen in rechten Unterbaum ∗) (T, deeper) ← RebalanceInsRight(T,right deeper) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (25) (26) (27) (T.right, right deeper) ← AVL insert(T.right, x, r) ; (∗ Rekursives Einfügen in rechten Unterbaum ∗) (T, deeper) ← RebalanceInsRight(T,right deeper) ; (∗ Rebalancierung in der Wurzel von T, FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (25) (26) (27) (T.right, right deeper) ← AVL insert(T.right, x, r) ; (∗ Rekursives Einfügen in rechten Unterbaum ∗) (T, deeper) ← RebalanceInsRight(T,right deeper) ; (∗ Rebalancierung in der Wurzel von T, symmetrisch zum 3. Fall. ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 (23) 4. Fall: T 6= NULL and T.key < x. (24) (25) (26) (27) (28) (T.right, right deeper) ← AVL insert(T.right, x, r) ; (∗ Rekursives Einfügen in rechten Unterbaum ∗) (T, deeper) ← RebalanceInsRight(T,right deeper) ; (∗ Rebalancierung in der Wurzel von T, symmetrisch zum 3. Fall. ∗) return (T, deeper) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 23 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. FG KTuEA, TU Ilmenau AuD – 26.05.2008 24 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. Ergebnis: Unterbaum T.left geändert, Flagbit left deeper bedeutet: left deeper = false: T.left hat gleiche Höhe wie vorher; left deeper = true: T.left ist um 1 Ebene tiefer geworden. FG KTuEA, TU Ilmenau AuD – 26.05.2008 24 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. Ergebnis: Unterbaum T.left geändert, Flagbit left deeper bedeutet: left deeper = false: T.left hat gleiche Höhe wie vorher; left deeper = true: T.left ist um 1 Ebene tiefer geworden. Invariante: (Beweis durch Induktion über rekursive Aufrufe/Größe von Bäumen): T.left ist AVL-Baum (mit korrekten Balancefaktoren). FG KTuEA, TU Ilmenau AuD – 26.05.2008 24 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. Ergebnis: Unterbaum T.left geändert, Flagbit left deeper bedeutet: left deeper = false: T.left hat gleiche Höhe wie vorher; left deeper = true: T.left ist um 1 Ebene tiefer geworden. Invariante: (Beweis durch Induktion über rekursive Aufrufe/Größe von Bäumen): T.left ist AVL-Baum (mit korrekten Balancefaktoren). Probleme: FG KTuEA, TU Ilmenau ? Balancebedingung in Wurzel von T erfüllt? AuD – 26.05.2008 24 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. Ergebnis: Unterbaum T.left geändert, Flagbit left deeper bedeutet: left deeper = false: T.left hat gleiche Höhe wie vorher; left deeper = true: T.left ist um 1 Ebene tiefer geworden. Invariante: (Beweis durch Induktion über rekursive Aufrufe/Größe von Bäumen): T.left ist AVL-Baum (mit korrekten Balancefaktoren). Probleme: FG KTuEA, TU Ilmenau ? Balancebedingung in Wurzel von T erfüllt? ? Balancefaktor in Wurzel von T korrekt? AuD – 26.05.2008 24 Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden. Ergebnis: Unterbaum T.left geändert, Flagbit left deeper bedeutet: left deeper = false: T.left hat gleiche Höhe wie vorher; left deeper = true: T.left ist um 1 Ebene tiefer geworden. Invariante: (Beweis durch Induktion über rekursive Aufrufe/Größe von Bäumen): T.left ist AVL-Baum (mit korrekten Balancefaktoren). Probleme: ? Balancebedingung in Wurzel von T erfüllt? ? Balancefaktor in Wurzel von T korrekt? Zeile (20): RebalanceInsLeft prüft und korrigiert; Ergebnis: Neuer Baum T und Flagbit deeper. FG KTuEA, TU Ilmenau AuD – 26.05.2008 24 RebalanceInsLeft(T,left deeper) FG KTuEA, TU Ilmenau AuD – 26.05.2008 25 RebalanceInsLeft(T,left deeper) Fall RebIL-1 Aktion: left deeper = false FG KTuEA, TU Ilmenau AuD – 26.05.2008 25 RebalanceInsLeft(T,left deeper) Fall RebIL-1 Aktion: left deeper = false T: neu aber gleiche Höhe FG KTuEA, TU Ilmenau AuD – 26.05.2008 25 RebalanceInsLeft(T,left deeper) Fall RebIL-1 Aktion: left deeper = false deeper ← false ; (∗ T.bal stimmt noch ∗) T: neu aber gleiche Höhe FG KTuEA, TU Ilmenau AuD – 26.05.2008 25 RebalanceInsLeft(T,left deeper) FG KTuEA, TU Ilmenau AuD – 26.05.2008 26 RebalanceInsLeft(T,left deeper) Fall RebIL-2 Aktion: left deeper = true ∧ T.bal = 0 (∗ alter Wert! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 26 RebalanceInsLeft(T,left deeper) Fall RebIL-2 Aktion: left deeper = true ∧ T.bal = 0 (∗ alter Wert! ∗) T: neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 26 RebalanceInsLeft(T,left deeper) Fall RebIL-2 Aktion: left deeper = true ∧ T.bal = 0 (∗ alter Wert! ∗) deeper ← true ; T.bal ← −1; T: neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 26 RebalanceInsLeft(T,left deeper) FG KTuEA, TU Ilmenau AuD – 26.05.2008 27 RebalanceInsLeft(T,left deeper) Fall RebIL-3 Aktion: left deeper = true ∧ T.bal = 1 (∗ alter Wert! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 27 RebalanceInsLeft(T,left deeper) Fall RebIL-3 Aktion: left deeper = true ∧ T.bal = 1 (∗ alter Wert! ∗) T: neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 27 RebalanceInsLeft(T,left deeper) Fall RebIL-3 Aktion: left deeper = true ∧ T.bal = 1 (∗ alter Wert! ∗) deeper ← false ; T.bal ← 0 ; T: neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 27 RebalanceInsLeft(T,left deeper) FG KTuEA, TU Ilmenau AuD – 26.05.2008 28 RebalanceInsLeft(T,left deeper) Fall RebIL-4 Aktion: left deeper = true ∧ T.bal = −1 (∗ alter Wert! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 28 RebalanceInsLeft(T,left deeper) Fall RebIL-4 Aktion: left deeper = true ∧ T.bal = −1 (∗ alter Wert! ∗) T: 0 T: 1 T: 2 neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 28 RebalanceInsLeft(T,left deeper) Fall RebIL-4 Aktion: left deeper = true ∧ T.bal = −1 (∗ alter Wert! ∗) ??? T: 0 T: 1 T: 2 neu: FG KTuEA, TU Ilmenau AuD – 26.05.2008 28 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: Fall RebIL-4 liefert stets deeper = false, analog RebIR-4. FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: Fall RebIL-4 liefert stets deeper = false, analog RebIR-4. Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false; analog liefern RebIR-1, RebIR-3 deeper = false. FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: Fall RebIL-4 liefert stets deeper = false, analog RebIR-4. Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false; analog liefern RebIR-1, RebIR-3 deeper = false. ⇒ beim rekursiven Aufruf der Rebalancierung für T.left ist Fall RebIL-2 oder der symmetrische Fall RebIR-2 eingetreten. FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: Fall RebIL-4 liefert stets deeper = false, analog RebIR-4. Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false; analog liefern RebIR-1, RebIR-3 deeper = false. ⇒ beim rekursiven Aufruf der Rebalancierung für T.left ist Fall RebIL-2 oder der symmetrische Fall RebIR-2 eingetreten. ⇒ Balancefaktor T.left.bal in T1 ist −1 oder 1. FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 Unterfall RebIL-1.1 Aktion: T.left.bal = − 1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 30 Unterfall RebIL-1.1 Aktion: T.left.bal = − 1 Rechtsrotation FG KTuEA, TU Ilmenau AuD – 26.05.2008 30 Unterfall RebIL-1.1 Aktion: T.left.bal = − 1 Rechtsrotation T: T 1: u T1,1 T1,2 T: v u v T2 T1,1 T1,2 T2 neu neu FG KTuEA, TU Ilmenau AuD – 26.05.2008 30 Unterfall RebIL-1.1 Aktion: T.left.bal = − 1 Rechtsrotation T: T 1: u T1,1 T1,2 T: v u v T2 T1,1 T1,2 T2 neu neu T ← rotateR(T) ; deeper ← false ; T.bal ← 0 ; T.right.bal ← 0 ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 30 Unterfall RebIL-1.2 Aktion: T.left.bal = 1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 31 Unterfall RebIL-1.2 Aktion: T.left.bal = 1 Links-RechtsDoppelrotation FG KTuEA, TU Ilmenau AuD – 26.05.2008 31 Unterfall RebIL-1.2 Aktion: T.left.bal = 1 Links-RechtsDoppelrotation T: w T: u T 1: w u T1,2: v T2 T 1,1 T’ FG KTuEA, TU Ilmenau v T 1,1 T 2 T’ T’’ T’’ AuD – 26.05.2008 31 Unterfall RebIL-1.2 Aktion: T.left.bal = 1 Links-RechtsDoppelrotation T: v w T: u T 1: w u T1,2: v T2 T 1,1 T’ T 1,1 T 2 T’ T’’ T’’ T ← rotateLR(T) ; deeper ← false ; Neue bal-Werte: s. Tabelle. FG KTuEA, TU Ilmenau AuD – 26.05.2008 31 Neue Werte: FG KTuEA, TU Ilmenau AuD – 26.05.2008 32 Neue Werte: altes T.bal −1 0 1 FG KTuEA, TU Ilmenau neues T.left.bal 0 0 −1 AuD – 26.05.2008 T.right.bal T.bal 1 0 0 0 0 0 32 Neue Werte: altes T.bal −1 0 1 neues T.left.bal 0 0 −1 T.right.bal T.bal 1 0 0 0 0 0 Die Zahl (altes) T.bal stand vor der LR-Rotation in T.left.right.bal, gab also den Balancefaktor des alten Unterbaums T1,2 = T.left.right an. FG KTuEA, TU Ilmenau AuD – 26.05.2008 32 Neue Werte: altes T.bal −1 0 1 neues T.left.bal 0 0 −1 T.right.bal T.bal 1 0 0 0 0 0 Die Zahl (altes) T.bal stand vor der LR-Rotation in T.left.right.bal, gab also den Balancefaktor des alten Unterbaums T1,2 = T.left.right an. Überlege: Kann es überhaupt passieren, dass der alte Baum T1,2 Balancefaktor 0 hat? FG KTuEA, TU Ilmenau AuD – 26.05.2008 32 Neue Werte: altes T.bal −1 0 1 neues T.left.bal 0 0 −1 T.right.bal T.bal 1 0 0 0 0 0 Die Zahl (altes) T.bal stand vor der LR-Rotation in T.left.right.bal, gab also den Balancefaktor des alten Unterbaums T1,2 = T.left.right an. Überlege: Kann es überhaupt passieren, dass der alte Baum T1,2 Balancefaktor 0 hat? – Antwort: Im rekursiven Aufruf AVL insert(T.left,x,r) bestand T.left nur aus einem Knoten, T1,2 ist der neu eingefügte Knoten; T 0, T 00 und T1,1 sind leer, haben also alle Tiefe −1. FG KTuEA, TU Ilmenau AuD – 26.05.2008 32 Faustregel für RebalanceInsLeft und RebalanceInsRight: FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. Wenn ein mittlerer Teilbaum zu tief wird: FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. Wenn ein mittlerer Teilbaum zu tief wird: Eine Doppelrotation hebt den mittleren Teilbaum ein Level höher. FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. Wenn ein mittlerer Teilbaum zu tief wird: Eine Doppelrotation hebt den mittleren Teilbaum ein Level höher. Mit den rekursiven Aufrufen läuft die Rebalancierung von unten nach oben. FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. Wenn ein mittlerer Teilbaum zu tief wird: Eine Doppelrotation hebt den mittleren Teilbaum ein Level höher. Mit den rekursiven Aufrufen läuft die Rebalancierung von unten nach oben. Nach dem ersten Auftreten von Fall RebIL-4 oder RebIR-4 (d. h. einer Rotation) ist die Rebalancierung beendet. FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Faustregel für RebalanceInsLeft und RebalanceInsRight: Wenn ein äußerer Teilbaum zu tief wird: Eine einfache Rotation hebt diesen Teilbaum ein Level höher. Wenn ein mittlerer Teilbaum zu tief wird: Eine Doppelrotation hebt den mittleren Teilbaum ein Level höher. Mit den rekursiven Aufrufen läuft die Rebalancierung von unten nach oben. Nach dem ersten Auftreten von Fall RebIL-4 oder RebIR-4 (d. h. einer Rotation) ist die Rebalancierung beendet. Dann bleibt deeper = false bis zur Wurzel. FG KTuEA, TU Ilmenau AuD – 26.05.2008 33 Proposition Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch. FG KTuEA, TU Ilmenau AuD – 26.05.2008 34 Proposition Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch. D. h.: Aus T entsteht ein AVL-Baum für insert(fT , x, r). FG KTuEA, TU Ilmenau AuD – 26.05.2008 34 Proposition Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch. D. h.: Aus T entsteht ein AVL-Baum für insert(fT , x, r). Die Prozedur hat Laufzeit O(log n) und führt höchstens eine Einfach- oder Doppelrotation durch. FG KTuEA, TU Ilmenau AuD – 26.05.2008 34 Folgerung (aus Algorithmus AVL insert): FG KTuEA, TU Ilmenau AuD – 26.05.2008 35 Folgerung (aus Algorithmus AVL insert): Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n Knoten. FG KTuEA, TU Ilmenau AuD – 26.05.2008 35 Folgerung (aus Algorithmus AVL insert): Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n Knoten. (Beweis: Man fügt 1, . . . , n mittels AVL insert in einen anfangs leeren AVL-Baum ein. Übung: Durchführen für n = 16.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 35 Folgerung (aus Algorithmus AVL insert): Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n Knoten. (Beweis: Man fügt 1, . . . , n mittels AVL insert in einen anfangs leeren AVL-Baum ein. Übung: Durchführen für n = 16.) Umgekehrt gilt: Wenn T ein höhenbalancierter Baum mit n Knoten ist, dann gibt es eine Einfügereihenfolge für 1, . . . , n, die genau diesen Baum erzeugt – sogar ohne jede Rotation (Übung). FG KTuEA, TU Ilmenau AuD – 26.05.2008 35 AVL delete Lösche wie bei gewöhnlichem BSB: FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. Wenn Balancebedingung nirgendwo verletzt ist: fertig. FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. Wenn Balancebedingung nirgendwo verletzt ist: fertig. Wenn Balancebedingung verletzt, laufe den Weg von u zur Wurzel, FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. Wenn Balancebedingung nirgendwo verletzt ist: fertig. Wenn Balancebedingung verletzt, laufe den Weg von u zur Wurzel, teste an jedem Knoten die Balancebedingung, führe gegebenenfalls eine Einfach- oder eine Doppelrotation aus: RebalanceDelLeft, RebalanceDelRight. FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 AVL delete Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. Wenn Balancebedingung nirgendwo verletzt ist: fertig. Wenn Balancebedingung verletzt, laufe den Weg von u zur Wurzel, teste an jedem Knoten die Balancebedingung, führe gegebenenfalls eine Einfach- oder eine Doppelrotation aus: RebalanceDelLeft, RebalanceDelRight. Steuerung einer Fallunterscheidung durch shallower-Flagbit. Achtung: Möglicherweise auf mehreren Levels nacheinander Rotation nötig. – Beispiel: Fibonacci-Bäume“ ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 36 −1 0 0 1 1 2 2 4 3 7 Fibonacci-Bäume der Tiefe −1, 0, 1, 2, 3 FG KTuEA, TU Ilmenau AuD – 26.05.2008 37 4 12 Knoten 20 Knoten 5 Fibonacci-Bäume der Tiefe 4, 5 FG KTuEA, TU Ilmenau AuD – 26.05.2008 37 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 links−links Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Entfernen eines bestimmten Blattes in einem Fibonacci-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 26.05.2008 38 Prozedur AVL delete(T,x) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) (3) 1. Fall: T = NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) (3) 1. Fall: T = NULL (∗ x nicht da ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) (6) 2. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) (6) 2. Fall: T 6= NULL and x < T.key. FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) 2. Fall: T 6= NULL and x < T.key. (7) (T.left, left shallower) ← AVL delete(T.left, x); (6) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) 2. Fall: T 6= NULL and x < T.key. (7) (T.left, left shallower) ← AVL delete(T.left, x); (8) (∗ Rekursives Löschen im linken Unterbaum ∗) (6) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) 2. Fall: T 6= NULL and x < T.key. (7) (T.left, left shallower) ← AVL delete(T.left, x); (8) (∗ Rekursives Löschen im linken Unterbaum ∗) (9) (T, shallower) ← RebalanceDelLeft(T,left shallower); (6) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) (6) (7) (8) (9) (10) 2. Fall: T 6= NULL and x < T.key. (T.left, left shallower) ← AVL delete(T.left, x); (∗ Rekursives Löschen im linken Unterbaum ∗) (T, shallower) ← RebalanceDelLeft(T,left shallower); (∗ Rebalancierung in der Wurzel von T, s. unten ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 Prozedur AVL delete(T,x) (1) (∗ Eingabe: T: AVL Tree, x: key ∗) (2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗) 1. Fall: T = NULL (∗ x nicht da ∗) (4) return (T, false) . (5) (∗ Keine Rebalancierung nötig! ∗) (3) (6) (7) (8) (9) (10) (11) 2. Fall: T 6= NULL and x < T.key. (T.left, left shallower) ← AVL delete(T.left, x); (∗ Rekursives Löschen im linken Unterbaum ∗) (T, shallower) ← RebalanceDelLeft(T,left shallower); (∗ Rebalancierung in der Wurzel von T, s. unten ∗) return (T, shallower). FG KTuEA, TU Ilmenau AuD – 26.05.2008 39 (12) 3. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. (13) (T.right, right shallower) ← AVL delete(T.right, x) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. (13) (14) (T.right, right shallower) ← AVL delete(T.right, x) ; (∗ Rekursives Löschen im rechten Unterbaum ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. (13) (14) (15) (T.right, right shallower) ← AVL delete(T.right, x) ; (∗ Rekursives Löschen im rechten Unterbaum ∗) (T, shallower) ← RebalanceDelRight(T,right shallower) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. (13) (14) (15) (16) (T.right, right shallower) ← AVL delete(T.right, x) ; (∗ Rekursives Löschen im rechten Unterbaum ∗) (T, shallower) ← RebalanceDelRight(T,right shallower) ; (∗ Rebalancierung in der Wurzel von T, symmetrisch zu 2. Fall ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (12) 3. Fall: T 6= NULL and T.key < x. (13) (14) (15) (16) (17) (T.right, right shallower) ← AVL delete(T.right, x) ; (∗ Rekursives Löschen im rechten Unterbaum ∗) (T, shallower) ← RebalanceDelRight(T,right shallower) ; (∗ Rebalancierung in der Wurzel von T, symmetrisch zu 2. Fall ∗) return (T, shallower) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 40 (18) 4. Fall: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (19) (∗ Entferne Wurzelknoten! ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) x war und ist AVLBaum FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) x war und ist AVLBaum (21) return (T.right, true) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) x war und ist AVLBaum (21) return (T.right, true) . (22) (∗ Baum ist flacher als vorher. ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) x war und ist AVLBaum (21) return (T.right, true) . (22) (∗ Baum ist flacher als vorher. ∗) (23) Fall 4b: T.right = NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (18) 4. Fall: T 6= NULL and T.key = x. (∗ Entferne Wurzelknoten! ∗) (20) Fall 4a: T.left = NULL (19) x war und ist AVLBaum (21) return (T.right, true) . (22) (∗ Baum ist flacher als vorher. ∗) (23) Fall 4b: T.right = NULL (24) return (T.left, true) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 41 (25) Fall 4c: T 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (T.right, v, right shallower) ← AVL extractMin(T.right) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (27) (T.right, v, right shallower) ← AVL extractMin(T.right) ; v.left ← T.left; v.right ← T.right; FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (27) (28) (T.right, v, right shallower) ← AVL extractMin(T.right) ; v.left ← T.left; v.right ← T.right; v.bal ← T.bal; FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (27) (28) (29) (T.right, v, right shallower) ← AVL extractMin(T.right) ; v.left ← T.left; v.right ← T.right; v.bal ← T.bal; T ← v; (∗ v ersetzt die Wurzel von T ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (27) (28) (29) (30) (T.right, v, right shallower) ← AVL extractMin(T.right) ; v.left ← T.left; v.right ← T.right; v.bal ← T.bal; T ← v; (∗ v ersetzt die Wurzel von T ∗) (T, shallower) ← RebalanceDelRight(T,right shallower) ; FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 (25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer x kleiner y (26) (27) (28) (29) (30) (31) (T.right, v, right shallower) ← AVL extractMin(T.right) ; v.left ← T.left; v.right ← T.right; v.bal ← T.bal; T ← v; (∗ v ersetzt die Wurzel von T ∗) (T, shallower) ← RebalanceDelRight(T,right shallower) ; return (T, shallower) . FG KTuEA, TU Ilmenau AuD – 26.05.2008 42 Prozedur AVL extractMin(T) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 Prozedur AVL extractMin(T) (1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 Prozedur AVL extractMin(T) (1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗) (2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 Prozedur AVL extractMin(T) (1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗) (2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗) (3) (∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 Prozedur AVL extractMin(T) (1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗) (2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗) (3) (4) (∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗) (∗ shallower = true, falls T flacher geworden ist ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 Prozedur AVL extractMin(T) (1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗) (2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗) (∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗) (4) (∗ shallower = true, falls T flacher geworden ist ∗) ... (3) FG KTuEA, TU Ilmenau AuD – 26.05.2008 43 In Prozedur AVL extractMin(T): Fall Schluss“: ” T.left = NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 44 In Prozedur AVL extractMin(T): Fall Schluss“: ” T.left = NULL bleibt AVL-Baum FG KTuEA, TU Ilmenau AuD – 26.05.2008 44 In Prozedur AVL extractMin(T): Fall Schluss“: ” Wurzel abhängen: T.left = NULL bleibt AVL-Baum FG KTuEA, TU Ilmenau AuD – 26.05.2008 44 In Prozedur AVL extractMin(T): Fall Schluss“: ” Wurzel abhängen: T.left = NULL bleibt AVL-Baum FG KTuEA, TU Ilmenau AuD – 26.05.2008 v ← T; T ← T.right return (T, v, true). 44 In Prozedur AVL extractMin(T): Fall Rekursion“: ” T.left 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 45 In Prozedur AVL extractMin(T): Fall Rekursion“: ” T.left 6= NULL FG KTuEA, TU Ilmenau AuD – 26.05.2008 45 In Prozedur AVL extractMin(T): Fall Rekursion“: ” T.left 6= NULL (T, v, left shallower) ← AVL extractMin(T.left); FG KTuEA, TU Ilmenau AuD – 26.05.2008 45 In Prozedur AVL extractMin(T): Fall Rekursion“: ” T.left 6= NULL (T, v, left shallower) ← AVL extractMin(T.left); (T, shallower) ← RebalanceDelLeft(T,left shallower); FG KTuEA, TU Ilmenau AuD – 26.05.2008 45 In Prozedur AVL extractMin(T): Fall Rekursion“: ” T.left 6= NULL (T, v, left shallower) ← AVL extractMin(T.left); (T, shallower) ← RebalanceDelLeft(T,left shallower); return(T, v, shallower). FG KTuEA, TU Ilmenau AuD – 26.05.2008 45 RebalanceDelLeft(T,left shallower) FG KTuEA, TU Ilmenau AuD – 26.05.2008 46 RebalanceDelLeft(T,left shallower) (∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 46 RebalanceDelLeft(T,left shallower) (∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗) (∗ (RebalanceDelRight: symmetrisch) ∗) FG KTuEA, TU Ilmenau AuD – 26.05.2008 46 RebalanceDelLeft(T,left shallower) (∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗) (∗ (RebalanceDelRight: symmetrisch) ∗) Situation: T: T1 T2 FG KTuEA, TU Ilmenau AuD – 26.05.2008 46 RebalanceDelLeft(T,left shallower) (∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗) (∗ (RebalanceDelRight: symmetrisch) ∗) Situation: T: T1 T: T2 FG KTuEA, TU Ilmenau durch rekursives Löschen in T1 umgebaut zu AuD – 26.05.2008 T1 T2 46 RebalanceDelLeft(T,left shallower) (∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗) (∗ (RebalanceDelRight: symmetrisch) ∗) Situation: T: T1 T: T2 durch rekursives Löschen in T1 umgebaut zu T1 T2 T1 = T.left verändert; in left shallower“ wird die Infor” mation geliefert, ob T1 flacher geworden ist. T.bal: unverändert. FG KTuEA, TU Ilmenau AuD – 26.05.2008 46 Fall Aktion Fall RebDL-1: left shallower = false FG KTuEA, TU Ilmenau AuD – 26.05.2008 47 Fall Aktion Fall RebDL-1: left shallower = false shallower ← false; FG KTuEA, TU Ilmenau AuD – 26.05.2008 47 Fall Aktion Fall RebDL-1: left shallower = false shallower ← false; Fall RebDL-2: left shallower = true ∧ T.bal = −1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 47 Fall Aktion Fall RebDL-1: left shallower = false shallower ← false; Fall RebDL-2: left shallower = true ∧ T.bal = −1 shallower ← true; T.bal ← 0; geschrumpft FG KTuEA, TU Ilmenau AuD – 26.05.2008 47 Fall Aktion Fall RebDL-3: left shallower = true ∧ T.bal = 0 geschrumpft FG KTuEA, TU Ilmenau AuD – 26.05.2008 48 Fall Aktion Fall RebDL-3: left shallower = true ∧ T.bal = 0 shallower ← false; T.bal ← 1; geschrumpft FG KTuEA, TU Ilmenau AuD – 26.05.2008 48 Fall RebDL-4: left shallower = true ∧ T.bal = 1 T1 FG KTuEA, TU Ilmenau T2 AuD – 26.05.2008 49 Fall RebDL-4: left shallower = true ∧ T.bal = 1 T1 T2 geschrumpft Unterfälle je nach Aussehen von T2. FG KTuEA, TU Ilmenau AuD – 26.05.2008 49 Fall RebDL-4: left shallower = true ∧ T.bal = 1 T1 T2 geschrumpft Unterfälle je nach Aussehen von T2. T2 hat Tiefe mindestens 1, da aus T1 ein Knoten entfernt werden konnte, also T1 Tiefe mindestens 0 hatte. FG KTuEA, TU Ilmenau AuD – 26.05.2008 49 Fall RebDL-4.1: T.right.bal = 0; T T.left T T.right T1 T1 T2 FG KTuEA, TU Ilmenau AuD – 26.05.2008 T2 T2 T2 50 Fall RebDL-4.1: T.right.bal = 0; T T T.left T.right T1 T1 T2 Linksrotation! FG KTuEA, TU Ilmenau T2 T2 T2 T ← rotateL(T); T.left.bal ← 1; T.bal ← −1; shallower ← false; AuD – 26.05.2008 50 Fall RebDL-4.1: T.right.bal = 0; T T T.left T.right T1 T1 T2 T2 T2 T2 T ← rotateL(T); T.left.bal ← 1; T.bal ← −1; shallower ← false; (∗ Rebalancierung beendet ∗) Linksrotation! FG KTuEA, TU Ilmenau AuD – 26.05.2008 50 Fall RebDL-4.2: T.right.bal = 1; T T.left T T.right T1 T2 T2 FG KTuEA, TU Ilmenau AuD – 26.05.2008 T1 T2 T2 51 Fall RebDL-4.2: T.right.bal = 1; T T T.left T.right T1 T2 T2 Linksrotation! FG KTuEA, TU Ilmenau T1 T2 T2 T ← rotateL(T); T.left.bal ← 0; T.bal ← 0; shallower ← true; AuD – 26.05.2008 51 Fall RebDL-4.3: T.right.bal = −1; T T1 T3 T2 FG KTuEA, TU Ilmenau AuD – 26.05.2008 52 Fall RebDL-4.3: (Forts.) Betrachte Teilbäume von T2 = T.right.left. T T: T1 T3 T2 FG KTuEA, TU Ilmenau T1 T3 T2 AuD – 26.05.2008 53 Fall RebDL-4.3: (Forts.) Betrachte Teilbäume von T2 = T.right.left. T T: T1 T3 T2 Doppelrotation! FG KTuEA, TU Ilmenau T1 T3 T2 T ← rotateRL(T); shallower ← true; AuD – 26.05.2008 53 Fall RebDL-4.3: (Forts.) Betrachte Teilbäume von T2 = T.right.left. T T: T1 T3 T2 T1 T3 T2 T ← rotateRL(T); shallower ← true; Neue Werte der Balancefaktoren: Doppelrotation! FG KTuEA, TU Ilmenau AuD – 26.05.2008 53 Neue Werte der Balancefaktoren: FG KTuEA, TU Ilmenau AuD – 26.05.2008 54 Neue Werte der Balancefaktoren: altes T.bal −1 0 1 FG KTuEA, TU Ilmenau neues T.left.bal T.right.bal T.bal 0 1 0 0 0 0 −1 0 0 AuD – 26.05.2008 54 Neue Werte der Balancefaktoren: altes T.bal −1 0 1 neues T.left.bal T.right.bal T.bal 0 1 0 0 0 0 −1 0 0 (Das alte T.bal enthält (nach der Doppelrotation) den Balancefaktor, der ursprünglich in der Wurzel des mittleren“ ” Unterbaums T2 stand.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 54 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. FG KTuEA, TU Ilmenau AuD – 26.05.2008 55 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. FG KTuEA, TU Ilmenau AuD – 26.05.2008 55 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. Die Prozedur hat Laufzeit O(log n) FG KTuEA, TU Ilmenau AuD – 26.05.2008 55 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. Die Prozedur hat Laufzeit O(log n) und führt an jedem Knoten auf dem Weg von der Wurzel zum gelöschten Knoten höchstens eine Einfach- oder Doppelrotation durch. FG KTuEA, TU Ilmenau AuD – 26.05.2008 55 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. Die Prozedur hat Laufzeit O(log n) und führt an jedem Knoten auf dem Weg von der Wurzel zum gelöschten Knoten höchstens eine Einfach- oder Doppelrotation durch. Satz In AVL-Bäumen kostet jede Wörterbuchoperation Zeit O(log n), wo n die Anzahl der Wörterbucheinträge ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 55 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 FG KTuEA, TU Ilmenau AuD – 26.05.2008 xl T1 Tl-1 Tl 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: y0 FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 < y1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 < y1 < x2 FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Bäume aus Knoten mit variablem Ausgrad Knoten mit mehreren Unterbäumen: x1 T0 xl T1 Tl-1 Tl x1 < · · · < xl. Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl FG KTuEA, TU Ilmenau AuD – 26.05.2008 56 Mehrweg-Such-Bäume Beispiel eines N-MSB: Wurzel 27 39 7 1 2 4 10 16 11 13 9 FG KTuEA, TU Ilmenau AuD – 26.05.2008 29 35 36 21 25 38 45 41 48 50 12 57 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind T0, T1, . . . , Tl U -MSBe mit: FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind T0, T1, . . . , Tl U -MSBe mit: Für yi in Ti, 0 ≤ i ≤ l: FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind T0, T1, . . . , Tl U -MSBe mit: Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Definition Mehrweg-Suchbäume (MSBe) über dem (angeordneten) Universum U sind wie folgt induktiv definiert: (0) Der leere Baum ist ein U -MSB. (1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und sind T0, T1, . . . , Tl U -MSBe mit: Für yi in Ti, 0 ≤ i ≤ l: y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl dann ist auch (T0, x1, T1, x2, . . . , xl−1, Tl−1, xl, Tl) ein U -Mehrweg-Suchbaum. FG KTuEA, TU Ilmenau AuD – 26.05.2008 58 Mehrweg-Such-Bäume Möglichkeit für Implementierung eines Knotens: Variante 1: Jeder Knoten enthält 2 Arrays. 1 2 3 4 l max 5 keys: 10 11 13 l: 3 0 1 l_max: 9 2 3 4 5 l max sons: FG KTuEA, TU Ilmenau AuD – 26.05.2008 59 Mehrweg-Such-Bäume Möglichkeit für Implementierung eines Knotens: Variante 2: Schlüssel und Kinder als Listen. keys: 10 11 13 sons: l: 3 FG KTuEA, TU Ilmenau AuD – 26.05.2008 60 Mehrweg-Such-Bäume Variante 3: Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare Liste von Binärbaumknoten dargestellt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 61 Mehrweg-Such-Bäume Variante 3: Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare Liste von Binärbaumknoten dargestellt. Jeder Knoten hat Platz für: Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten in Liste. Im Knoten muss als boolescher Wert vermerkt sein, ob es sich um den Knoten am Listenende handelt. (Im Bild: *“.) ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 61 Mehrweg-Such-Bäume Variante 3: Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare Liste von Binärbaumknoten dargestellt. Jeder Knoten hat Platz für: Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten in Liste. Im Knoten muss als boolescher Wert vermerkt sein, ob es sich um den Knoten am Listenende handelt. (Im Bild: *“.) ” Dieser Knoten hat zwei Zeiger auf Unterbäume. FG KTuEA, TU Ilmenau AuD – 26.05.2008 61 Mehrweg-Such-Bäume Variante 3: Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare Liste von Binärbaumknoten dargestellt. Jeder Knoten hat Platz für: Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten in Liste. Im Knoten muss als boolescher Wert vermerkt sein, ob es sich um den Knoten am Listenende handelt. (Im Bild: *“.) ” Dieser Knoten hat zwei Zeiger auf Unterbäume. Elegant: Für die Suche kann man die gewöhnliche Suchprozedur für binäre Suchbäume benutzen. FG KTuEA, TU Ilmenau AuD – 26.05.2008 61 Mehrweg-Such-Bäume T: 39 * 27 7 1 2 4 * 16 * 10 9 * FG KTuEA, TU Ilmenau AuD – 26.05.2008 11 13 * 21 25 * 12 * 62 2-3-Bäume Definition Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt: FG KTuEA, TU Ilmenau AuD – 26.05.2008 63 2-3-Bäume Definition Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt: (a) Jeder Knoten enthält 1 oder 2 Schlüssel (also hat jeder Knoten 2 oder 3 Unterbäume, was der Struktur den Namen gibt); FG KTuEA, TU Ilmenau AuD – 26.05.2008 63 2-3-Bäume Definition Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt: (a) Jeder Knoten enthält 1 oder 2 Schlüssel (also hat jeder Knoten 2 oder 3 Unterbäume, was der Struktur den Namen gibt); (b) Für jeden Knoten v in T gilt: wenn v einen leeren Unterbaum hat, so sind alle Unterbäume unter v leer, d.h. v ist dann Blatt; FG KTuEA, TU Ilmenau AuD – 26.05.2008 63 2-3-Bäume Definition Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt: (a) Jeder Knoten enthält 1 oder 2 Schlüssel (also hat jeder Knoten 2 oder 3 Unterbäume, was der Struktur den Namen gibt); (b) Für jeden Knoten v in T gilt: wenn v einen leeren Unterbaum hat, so sind alle Unterbäume unter v leer, d.h. v ist dann Blatt; (c) Alle Blätter von T haben dieselbe Tiefe. FG KTuEA, TU Ilmenau AuD – 26.05.2008 63 2-3-Bäume Beispiele: FG KTuEA, TU Ilmenau AuD – 26.05.2008 64 2-3-Bäume Beispiele: Leerer 2-3-Baum: FG KTuEA, TU Ilmenau AuD – 26.05.2008 64 2-3-Bäume Beispiele: Leerer 2-3-Baum: 2-3-Baum mit 2 Ebenen: A FG KTuEA, TU Ilmenau G O I L AuD – 26.05.2008 Level 1 R Level 0 = Blattebene 64 2-3-Bäume Beispiele: Leerer 2-3-Baum: 2-3-Baum mit 2 Ebenen: A G O I L Level 1 R Level 0 = Blattebene NB: Die Ebenen werden von den Blättern her nummeriert. FG KTuEA, TU Ilmenau AuD – 26.05.2008 64 2-3-Bäume Beispiele: FG KTuEA, TU Ilmenau AuD – 26.05.2008 65 2-3-Bäume Beispiele: I Level 2 G A O H FG KTuEA, TU Ilmenau L AuD – 26.05.2008 M T R Level 1 S U Level 0 = Blattebene 65 2-3-Bäume L A FG KTuEA, TU Ilmenau AuD – 26.05.2008 M O T R U 66 2-3-Bäume L A O T M R U Kein 2-3-Baum (zu großer Grad). FG KTuEA, TU Ilmenau AuD – 26.05.2008 66 2-3-Bäume G A O L FG KTuEA, TU Ilmenau AuD – 26.05.2008 M R 67 2-3-Bäume G A O L M R Kein 2-3-Baum (Blätter in verschiedenen Tiefen). FG KTuEA, TU Ilmenau AuD – 26.05.2008 67 2-3-Bäume A FG KTuEA, TU Ilmenau AuD – 26.05.2008 G O I L 68 2-3-Bäume A G O I L Kein 2-3-Baum (Leerer Unterbaum in Nicht-Blatt). FG KTuEA, TU Ilmenau AuD – 26.05.2008 68 2-3-Bäume: Logarithmische Tiefe Proposition FG KTuEA, TU Ilmenau AuD – 26.05.2008 69 2-3-Bäume: Logarithmische Tiefe Proposition Die Tiefe eines 2-3-Baums mit n Daten ist mindestens dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1. FG KTuEA, TU Ilmenau AuD – 26.05.2008 69 2-3-Bäume: Logarithmische Tiefe Proposition Die Tiefe eines 2-3-Baums mit n Daten ist mindestens dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1. [log3 x ≈ 0.63 log2 x] FG KTuEA, TU Ilmenau AuD – 26.05.2008 69 2-3-Bäume: Logarithmische Tiefe Proposition Die Tiefe eines 2-3-Baums mit n Daten ist mindestens dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1. [log3 x ≈ 0.63 log2 x] Beweis: Übung. FG KTuEA, TU Ilmenau AuD – 26.05.2008 69 2-3-Bäume: Logarithmische Tiefe Proposition Die Tiefe eines 2-3-Baums mit n Daten ist mindestens dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1. [log3 x ≈ 0.63 log2 x] Beweis: Übung. Level h h-1 1 0 FG KTuEA, TU Ilmenau AuD – 26.05.2008 69 Suche in 2-3-Bäumen: Rekursiv FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. 2b: x = x1: gefunden“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. 2b: x = x1: gefunden“. ” 2c: x1 < x und ( x2 existiert nicht oder x < x2): FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. 2b: x = x1: gefunden“. ” 2c: x1 < x und ( x2 existiert nicht oder x < x2): Rufe lookup für zweiten Unterbaum T1 auf. FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. 2b: x = x1: gefunden“. ” 2c: x1 < x und ( x2 existiert nicht oder x < x2): Rufe lookup für zweiten Unterbaum T1 auf. 2d: x2 existiert und x = x2: gefunden“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv lookup(T, x), für 2-3-Baum T , x ∈ U . 1. Fall: T = . Ausgabe: ↑ 2. Fall: Die Wurzel von T enthält Schlüssel x1 (und eventuell x2 > x1). 2a: x < x1: Rufe lookup für ersten Unterbaum T0 auf. 2b: x = x1: gefunden“. ” 2c: x1 < x und ( x2 existiert nicht oder x < x2): Rufe lookup für zweiten Unterbaum T1 auf. 2d: x2 existiert und x = x2: gefunden“. ” 2e: x2 existiert und x2 < x: Rufe lookup für dritten Unterbaum T2 auf. FG KTuEA, TU Ilmenau AuD – 26.05.2008 70 Suche in 2-3-Bäumen: Rekursiv Klar: FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Suche in 2-3-Bäumen: Rekursiv Klar: Zeitaufwand: FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Suche in 2-3-Bäumen: Rekursiv Klar: Zeitaufwand: Wenn x im Knoten vx sitzt: FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Suche in 2-3-Bäumen: Rekursiv Klar: Zeitaufwand: Wenn x im Knoten vx sitzt: Für jeden Knoten v auf dem Weg von der Wurzel zu vx entstehen Kosten O(1). FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Suche in 2-3-Bäumen: Rekursiv Klar: Zeitaufwand: Wenn x im Knoten vx sitzt: Für jeden Knoten v auf dem Weg von der Wurzel zu vx entstehen Kosten O(1). ⇒ Zeit für Suche ist FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Suche in 2-3-Bäumen: Rekursiv Klar: Zeitaufwand: Wenn x im Knoten vx sitzt: Für jeden Knoten v auf dem Weg von der Wurzel zu vx entstehen Kosten O(1). ⇒ Zeit für Suche ist O(log n). FG KTuEA, TU Ilmenau AuD – 26.05.2008 71 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel. FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel. 1. Fall: T = . FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel. 1. Fall: T = . Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2 leeren Unterbäumen (Blatt!) FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel. 1. Fall: T = . Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2 leeren Unterbäumen (Blatt!) return (T, true) FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv insert(T, x, r), für 2-3-Baum T , x ∈ U . Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist. Invariante (I): (Benutzen – Kontrollieren): T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel. 1. Fall: T = . Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2 leeren Unterbäumen (Blatt!) return (T, true) (I) stimmt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 72 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: FG KTuEA, TU Ilmenau higher ← false; AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. Rebalancierung (s.u.). FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. Rebalancierung (s.u.). 2d: x2 existiert und x = x2: Update: FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. Rebalancierung (s.u.). 2d: x2 existiert und x = x2: Update: FG KTuEA, TU Ilmenau AuD – 26.05.2008 higher ← false; 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. Rebalancierung (s.u.). 2d: x2 existiert und x = x2: Update: higher ← false; 2e: x2 existiert und x2 < x: insert(T2) liefert T20 und sub higher. FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rekursiv 2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2. 2a: x < x1: insert(T0) liefert T00 und sub higher. Rebalancierung (s.u.). 2b: x = x1: Update: higher ← false; 2c: x1 < x und (x2 existiert nicht oder x < x2): insert(T1) liefert T10 und sub higher. Rebalancierung (s.u.). 2d: x2 existiert und x = x2: Update: higher ← false; 2e: x2 existiert und x2 < x: insert(T2) liefert T20 und sub higher. Rebalancierung (s.u.). FG KTuEA, TU Ilmenau AuD – 26.05.2008 73 Einfügen in 2-3-Bäumen: Rebalancierung Fälle 2a/2c/2e: FG KTuEA, TU Ilmenau AuD – 26.05.2008 74 Einfügen in 2-3-Bäumen: Rebalancierung Fälle 2a/2c/2e: Fall 2a(i)/2c(i)/2e(i): sub_higher = false. FG KTuEA, TU Ilmenau AuD – 26.05.2008 74 Einfügen in 2-3-Bäumen: Rebalancierung Fälle 2a/2c/2e: Fall 2a(i)/2c(i)/2e(i): sub_higher = false. Der veränderte Teilbaum ist nicht tiefer geworden. FG KTuEA, TU Ilmenau AuD – 26.05.2008 74 Einfügen in 2-3-Bäumen: Rebalancierung Fälle 2a/2c/2e: Fall 2a(i)/2c(i)/2e(i): sub_higher = false. Der veränderte Teilbaum ist nicht tiefer geworden. Keine weitere Rebalancierung nötig: Setze higher ← false. FG KTuEA, TU Ilmenau AuD – 26.05.2008 74 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(ii)/2c(ii): x2 existiert nicht und sub_higher = true FG KTuEA, TU Ilmenau AuD – 26.05.2008 75 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(ii)/2c(ii): x2 existiert nicht und sub_higher = true 2a(ii): Benutze (I)! FG KTuEA, TU Ilmenau AuD – 26.05.2008 75 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(ii)/2c(ii): x2 existiert nicht und sub_higher = true 2a(ii): Benutze (I)! x1 T T0 Umbau z T x1 z alt T1 neu, tiefer T00 T00 FG KTuEA, TU Ilmenau T01 T1 T01 AuD – 26.05.2008 75 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(ii)/2c(ii): x2 existiert nicht und sub_higher = true 2a(ii): Benutze (I)! x1 T T0 Umbau z T x1 z alt T1 neu, tiefer T00 T00 T01 T1 T01 higher ← false FG KTuEA, TU Ilmenau AuD – 26.05.2008 75 Einfügen in 2-3-Bäumen: Rebalancierung 2c(ii): Benutze (I)! FG KTuEA, TU Ilmenau AuD – 26.05.2008 76 Einfügen in 2-3-Bäumen: Rebalancierung 2c(ii): Benutze (I)! x1 T T1 alt Umbau z T0 T z neu, tiefer T0 T10 FG KTuEA, TU Ilmenau x1 T10 T11 T11 AuD – 26.05.2008 76 Einfügen in 2-3-Bäumen: Rebalancierung 2c(ii): Benutze (I)! x1 T T1 alt Umbau z T0 T x1 z neu, tiefer T0 T10 T10 T11 T11 higher ← false FG KTuEA, TU Ilmenau AuD – 26.05.2008 76 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(iii)/2c(iii)/2e(iii): x2 existiert und sub_higher = true FG KTuEA, TU Ilmenau AuD – 26.05.2008 77 Einfügen in 2-3-Bäumen: Rebalancierung Fall 2a(iii)/2c(iii)/2e(iii): x2 existiert und sub_higher = true Benutze jeweils (I)! FG KTuEA, TU Ilmenau AuD – 26.05.2008 77 Einfügen in 2-3-Bäumen: Rebalancierung 2a(iii): T T0 x1 x2 T z T1 T00 FG KTuEA, TU Ilmenau T01 AuD – 26.05.2008 x2 z Umbau neu, tiefer x1 T2 T00 T01 T1 T2 78 Einfügen in 2-3-Bäumen: Rebalancierung 2a(iii): T T0 x1 x2 T z T1 T00 T01 x2 z Umbau neu, tiefer x1 T2 T00 T01 T1 T2 higher ← FG KTuEA, TU Ilmenau AuD – 26.05.2008 78 Einfügen in 2-3-Bäumen: Rebalancierung 2a(iii): T T0 x1 x2 T z T1 T00 T01 x2 z Umbau neu, tiefer x1 T2 T00 T01 T1 T2 higher ← true FG KTuEA, TU Ilmenau AuD – 26.05.2008 78 Einfügen in 2-3-Bäumen: Rebalancierung 2a(iii): T T0 x1 x2 T z T1 T00 T01 x2 z Umbau neu, tiefer x1 T2 T00 T01 T1 T2 higher ← true Prüfe: (I) erfüllt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 78 Einfügen in 2-3-Bäumen: Rebalancierung 2c(iii): x1 T T1 x2 z T Umbau z x1 x2 T2 T0 T10 FG KTuEA, TU Ilmenau T11 AuD – 26.05.2008 T0 T10 T11 T2 79 Einfügen in 2-3-Bäumen: Rebalancierung 2c(iii): x1 T T1 x2 z T Umbau z x1 x2 T2 T0 T10 T11 T0 T10 T11 T2 higher ← FG KTuEA, TU Ilmenau AuD – 26.05.2008 79 Einfügen in 2-3-Bäumen: Rebalancierung 2c(iii): x1 T T1 x2 z T Umbau z x1 x2 T2 T0 T10 T11 T0 T10 T11 T2 higher ← true FG KTuEA, TU Ilmenau AuD – 26.05.2008 79 Einfügen in 2-3-Bäumen: Rebalancierung 2c(iii): x1 T T1 x2 z T Umbau z x1 x2 T2 T0 T10 T11 T0 T10 T11 T2 higher ← true Prüfe: (I) erfüllt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 79 Einfügen in 2-3-Bäumen: Rebalancierung 2e(iii): T x2 x1 T2 T0 Umbau z x1 z T1 T20 FG KTuEA, TU Ilmenau x2 T T21 AuD – 26.05.2008 T0 T1 T20 T21 80 Einfügen in 2-3-Bäumen: Rebalancierung 2e(iii): T x2 x1 T2 T0 x2 T Umbau z x1 z T1 T20 T21 T0 T1 T20 T21 higher ← FG KTuEA, TU Ilmenau AuD – 26.05.2008 80 Einfügen in 2-3-Bäumen: Rebalancierung 2e(iii): T x2 x1 T2 T0 x2 T Umbau z x1 z T1 T20 T21 T0 T1 T20 T21 higher ← true FG KTuEA, TU Ilmenau AuD – 26.05.2008 80 Einfügen in 2-3-Bäumen: Rebalancierung 2e(iii): T x2 x1 T2 T0 x2 T Umbau z x1 z T1 T20 T21 T0 T1 T20 T21 higher ← true Prüfe: (I) erfüllt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 80 Einfügen in 2-3-Bäumen Beobachtung: Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 81 Einfügen in 2-3-Bäumen Beobachtung: Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“. ” Proposition FG KTuEA, TU Ilmenau AuD – 26.05.2008 81 Einfügen in 2-3-Bäumen Beobachtung: Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“. ” Proposition (a) Die Prozedur insert ist korrekt, d.h. sie erhält die 2-3Baum-Struktur. FG KTuEA, TU Ilmenau AuD – 26.05.2008 81 Einfügen in 2-3-Bäumen Beobachtung: Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“. ” Proposition (a) Die Prozedur insert ist korrekt, d.h. sie erhält die 2-3Baum-Struktur. (b) Das Einfügen eines Schlüssels in einen 2-3-Baum mit n Schlüsseln benötigt Zeit O(log n) und bewirkt die Erzeugung von höchstens log2 n neuer Knoten. FG KTuEA, TU Ilmenau AuD – 26.05.2008 81 Einfügen in 2-3-Bäumen Beweis: FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Einfügen in 2-3-Bäumen Beweis: (a) Man kontrolliert in jedem Fall des Algorithmus nach, dass die 2-3-Baum-Struktur wiederhergestellt wird. FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Einfügen in 2-3-Bäumen Beweis: (a) Man kontrolliert in jedem Fall des Algorithmus nach, dass die 2-3-Baum-Struktur wiederhergestellt wird. (b) Für die Bearbeitung eines Levels in der insert-Prozedur wird Zeit O(1) benötigt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Einfügen in 2-3-Bäumen Beweis: (a) Man kontrolliert in jedem Fall des Algorithmus nach, dass die 2-3-Baum-Struktur wiederhergestellt wird. (b) Für die Bearbeitung eines Levels in der insert-Prozedur wird Zeit O(1) benötigt. Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu gebildet. FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Einfügen in 2-3-Bäumen Beweis: (a) Man kontrolliert in jedem Fall des Algorithmus nach, dass die 2-3-Baum-Struktur wiederhergestellt wird. (b) Für die Bearbeitung eines Levels in der insert-Prozedur wird Zeit O(1) benötigt. Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu gebildet. Folgerung: Für jedes n ≥ 0 existiert ein 2-3-Baum mit n Schlüsseln. FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Einfügen in 2-3-Bäumen Beweis: (a) Man kontrolliert in jedem Fall des Algorithmus nach, dass die 2-3-Baum-Struktur wiederhergestellt wird. (b) Für die Bearbeitung eines Levels in der insert-Prozedur wird Zeit O(1) benötigt. Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu gebildet. Folgerung: Für jedes n ≥ 0 existiert ein 2-3-Baum mit n Schlüsseln. (Man füge in einen anfangs leeren Baum die Schlüssel 1, . . . , n ein.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 82 Löschen in 2-3-Bäumen Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem Blatt gespeichert ist. FG KTuEA, TU Ilmenau AuD – 26.05.2008 83 Löschen in 2-3-Bäumen Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem Blatt gespeichert ist. (x oder der Inorder-Nachfolger von x.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 83 Löschen in 2-3-Bäumen Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem Blatt gespeichert ist. (x oder der Inorder-Nachfolger von x.) Setze y an die Stelle von x und entferne y. FG KTuEA, TU Ilmenau AuD – 26.05.2008 83 Löschen in 2-3-Bäumen Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem Blatt gespeichert ist. (x oder der Inorder-Nachfolger von x.) Setze y an die Stelle von x und entferne y. Fazit: Man muss sich nur um das Löschen eines Eintrags y in einem Blatt kümmern. FG KTuEA, TU Ilmenau AuD – 26.05.2008 83 Löschen in 2-3-Bäumen Einfacher Fall: Neben y hat das Blatt noch andere Einträge. FG KTuEA, TU Ilmenau AuD – 26.05.2008 84 Löschen in 2-3-Bäumen Einfacher Fall: Neben y hat das Blatt noch andere Einträge. Keine Umstrukturierung nötig. FG KTuEA, TU Ilmenau AuD – 26.05.2008 84 Löschen in 2-3-Bäumen Einfacher Fall: Neben y hat das Blatt noch andere Einträge. Keine Umstrukturierung nötig. Rebalancierungsfall: Durch das Streichen von y wird das Blatt leer, verliert also an Höhe. FG KTuEA, TU Ilmenau AuD – 26.05.2008 84 Löschen in 2-3-Bäumen Einfacher Fall: Neben y hat das Blatt noch andere Einträge. Keine Umstrukturierung nötig. Rebalancierungsfall: Durch das Streichen von y wird das Blatt leer, verliert also an Höhe. Ähnlich wie bei den Einfügungen werden flacher gewordene Teilbäume durch lokale Umstellungen wieder auf die Höhe der anderen Teilbäume gebracht. FG KTuEA, TU Ilmenau AuD – 26.05.2008 84 Gesehen – Gehört – Gekonnt? • Begriff höhenbalancierter Binärbaum“ (flache Auffassung, ” rekursive Auffassung) definieren können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 85 Gesehen – Gehört – Gekonnt? • Begriff höhenbalancierter Binärbaum“ (flache Auffassung, ” rekursive Auffassung) definieren können. • Tiefenanalyse für höhenbalancierte BB durchführen können: Induktionsbeweis, Ergebnis. FG KTuEA, TU Ilmenau AuD – 26.05.2008 85 Gesehen – Gehört – Gekonnt? • Begriff höhenbalancierter Binärbaum“ (flache Auffassung, ” rekursive Auffassung) definieren können. • Tiefenanalyse für höhenbalancierte BB durchführen können: Induktionsbeweis, Ergebnis. • Begriff AVL-Baum. An Beispielen erkennen können, ob ein AVL-Baum vorliegt. FG KTuEA, TU Ilmenau AuD – 26.05.2008 85 Gesehen – Gehört – Gekonnt? • Begriff höhenbalancierter Binärbaum“ (flache Auffassung, ” rekursive Auffassung) definieren können. • Tiefenanalyse für höhenbalancierte BB durchführen können: Induktionsbeweis, Ergebnis. • Begriff AVL-Baum. An Beispielen erkennen können, ob ein AVL-Baum vorliegt. • Einfügen in AVL-Baum: An Beispielen durchführen können. (Test: Zahlen 1, . . . , 16 nacheinander einfügen.) FG KTuEA, TU Ilmenau AuD – 26.05.2008 85 Gesehen – Gehört – Gekonnt? • Begriff höhenbalancierter Binärbaum“ (flache Auffassung, ” rekursive Auffassung) definieren können. • Tiefenanalyse für höhenbalancierte BB durchführen können: Induktionsbeweis, Ergebnis. • Begriff AVL-Baum. An Beispielen erkennen können, ob ein AVL-Baum vorliegt. • Einfügen in AVL-Baum: An Beispielen durchführen können. (Test: Zahlen 1, . . . , 16 nacheinander einfügen.) • Einfügen in AVL-Baum: Rekursive Struktur der Einfügeund der Rebalancierungs-Prozedur erklären können, Rolle der Flagbits deeper“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 85 Gesehen – Gehört – Gekonnt? • Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 86 Gesehen – Gehört – Gekonnt? • Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können. • Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern. FG KTuEA, TU Ilmenau AuD – 26.05.2008 86 Gesehen – Gehört – Gekonnt? • Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können. • Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern. • Löschen in AVL-Baum: An Beispielen durchführen können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 86 Gesehen – Gehört – Gekonnt? • Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können. • Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern. • Löschen in AVL-Baum: An Beispielen durchführen können. • Löschen in AVL-Baum: Rekursive Struktur der Einfüge- und der Rebalancierungs-Prozedur erklären können, Rolle der Flagbits shallower“. ” FG KTuEA, TU Ilmenau AuD – 26.05.2008 86 Gesehen – Gehört – Gekonnt? • Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können. • Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern. • Löschen in AVL-Baum: An Beispielen durchführen können. • Löschen in AVL-Baum: Rekursive Struktur der Einfüge- und der Rebalancierungs-Prozedur erklären können, Rolle der Flagbits shallower“. ” • Löschen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern. FG KTuEA, TU Ilmenau AuD – 26.05.2008 86 • Begriff Mehrwegsuchbaum definieren können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 87 • Begriff Mehrwegsuchbaum definieren können. • Suche in Mehrwegsuchbaum beschreiben und an Beispiel durchführen können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 87 • Begriff Mehrwegsuchbaum definieren können. • Suche in Mehrwegsuchbaum beschreiben und an Beispiel durchführen können. • Begriff 2-3-Baum definieren können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 87 • Begriff Mehrwegsuchbaum definieren können. • Suche in Mehrwegsuchbaum beschreiben und an Beispiel durchführen können. • Begriff 2-3-Baum definieren können. • Einfügung in 2-3-Baum beschreiben und an Beispielen durchführen können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 87 • Begriff Mehrwegsuchbaum definieren können. • Suche in Mehrwegsuchbaum beschreiben und an Beispiel durchführen können. • Begriff 2-3-Baum definieren können. • Einfügung in 2-3-Baum beschreiben und an Beispielen durchführen können. • Löschung in 2-3-Baum beschreiben und an Beispielen durchführen können. FG KTuEA, TU Ilmenau AuD – 26.05.2008 87