Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Diskrete Mathematik I Vorlesung 8 Binärer Suchbaum IV AVL-Baum I 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Durchlaufstrategien • Preorder – Die Wurzel wird vor den Unterbäumen besucht, die Unterbäume werden von links nach rechts abgearbeitet • Breitendurchlauf – Mit einem Knoten werden seine Nachbarn von links nach rechts besucht 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Durchlaufstrategie: Breitendurchlauf 16 10 24 9 14 13 Warteschlange A 26x 16 18 15 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 24 9 14 13 Ws A 26x 16 18 15 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 24 9 14 13 Ws A 26x 10 18 15 24 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 9 14 13 Ws A 26x 10 18 15 24 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 9 14 13 Ws A 26x 24 18 15 9 14 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 9 14 13 Ws A 26x 24 18 15 9 14 24 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 9 14 13 Ws A 26x 9 18 15 14 18 24 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 9 18 15 14 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 14 18 15 18 14 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 18 18 15 13 15 14 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 18 18 15 13 15 14 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 13 18 15 15 14 18 13 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 15 18 15 14 18 13 15 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Durchlaufstrategie: Breitendurchlauf 16 16 10 10 24 24 9 9 14 13 Ws A 26x 18 15 14 18 13 15 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 Test auf Ende Durchlaufstrategie: Breitendurchlauf entferne class BST { ... void Breitendurchlauf() { SohnListe ws = new SohnListe(); Knoten aktuell; ws.FügeAn(wurzel); while ((aktuell = ws.Entferne()) != null) { System.out.println(aktuell.GibWert()); ws.FügeAn(aktuell.GibLinks()); ws.FügeAn(aktuell.GibRechts()); } } ... } A 2x 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Breitendurchlauf: SohnElem knoten (statt int) class SohnElem { private Knoten wert; private SohnElem weiter; SohnElem(Knoten k) { wert = k; weiter = null; } void SetzeWert(Knoten k) { wert = k; } Knoten GibWert() { return wert; } void SetzeWeiter(SohnElem s) { weiter = s; } SohnElem GibWeiter() { return weiter; } } 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Breitendurchlauf: SohnListe, FügeAn (hinten) class SohnListe { private SohnElem kopf, fuß; Sohn Liste() {kopf = fuß = null;} void FügeAn(Knoten an) { SohnElem neu = new SohnElem(an); if (fuß != null) { fuß.SetzeWeiter(neu); fuß = neu; } else kopf = fuß = neu; } 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Breitendurchlauf: Entferne vorne . . . Knoten Entferne() { Knoten erster = null; if (kopf != null) { erster = kopf.GibWert(); kopf = kopf.GibWeiter(); if (kopf == null) fuss = null; } return erster; } } 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Vergleich „Binäre Suchbäume“ - „Liste“ • • • • • in einem binären Suchbaum findet man schneller ein vorhandenes Objekt in einem binären Suchbaum stellt man schneller fest, daß ein Objekt nicht vorhanden ist warum? – der Weg vom Kopf zur Wurzel ist im allgemeinen kürzer als der Weg vom Anfang zum Ende eine Liste – (kann man das genauer, d. h. quantitativ angeben? • später) es gibt aber auch ungünstige Fälle, wo der Baum aussieht wie eine Liste diese Fälle treten stets bei der iterativen Eingabe sortierter Elemente auf 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Beispiele für den Aufbau binärer Suchbäume Eingabefolge 1-2-3 Eingabefolge 3-2-1 1 3 2 2 3 Eingabefolge 2-3-1 oder 2-1-3 1 Eingabefolge 3-1-2 3 2 1 A 7x 1 3 2 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 AVL-Baum (Definition) Ein binärer Baum heißt ausgeglichener Baum oder AVL-Baum (nach AdelsonVelskij und Landis), falls sich für jeden Knoten k die Höhen h der beiden Teilbäume um höchstens 1 unterscheiden. 18 19 Diskrete Mathe 1 1 2 3 4 AVL-Baum: Beispiel 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 Balancefaktor Balancefaktor bal(k) bal(k) = h(rechter Teilbaum von k) - h(linker Teilbaum von k) Für AVL-Bäume gilt: bal(k) {1,0,1} 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 AVL-Baum: Beispiel +1 -1 0 +1 0 +1 0 A 2x Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 AVL-Baum: Beispiel +1 -1 0 +1 0 +1 0 A 2x Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 AVL-Baum: Beispiel +2 0 +1 0 +1 0 A 2x Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 26 A 36x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 26 A 36x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 26 A 36x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 26 A 36x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 26 A 36x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 0 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 0 +1 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +1 0 33 -1 +1 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +2 0 33 -1 +1 Ausgeglichenheit ist verletzt 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +2 0 33 -1 +1 Ausbalancieren durch Rotation 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +2 0 33 -1 +1 R- Rotation 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +2 0 33 -1 +1 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 +2 0 33 -1 +1 39 26 30 A 36x 0 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 0 +2 26 33 L- Rotation 30 A 36x 39 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 0 +2 26 33 30 A 36x 39 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 20 11 0 17 0 +2 26 33 30 A 36x 39 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 26 11 0 20 17 A 36x 0 0 0 33 0 0 30 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 Einfügen von k = 30 8 3 0 +1 0 26 11 0 20 17 A 36x 0 0 0 33 0 0 30 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Einfügen von Knoten 14 8 3 0 +1 0 26 11 0 20 17 A 36x 0 0 0 33 0 0 30 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 8 3 0 0 20 11 0 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 8 3 0 0 20 11 0 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 8 3 0 0 20 11 0 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 11 3 0 -1 20 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 11 3 0 -1 20 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 8 14 11 3 0 -1 20 17 +1 0 33 0 0 26 A 9x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 11 11 3 0 14 -1 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 11 11 3 0 14 -1 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 11 11 3 0 14 -1 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +1 Löschen von k = 11 14 3 0 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +2 Löschen von k = 11 14 3 0 20 17 +1 0 33 0 0 L- Rotation A 15x 26 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +2 Löschen von k = 11 14 3 0 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten +2 Löschen von k = 11 14 3 0 20 17 +1 0 33 0 0 26 A 15x 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten 0 Löschen von k = 11 14 3 A 15x 0 20 0 33 17 0 26 0 0 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Löschen von Knoten 0 20 14 3 A 15x 0 0 33 17 0 26 0 0 39 0 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 L-Rotation Knoten x wird eingefügt und verletzt dadurch die Ausgeglichenheit an einem höher gelegenen Knoten k1 Notwendige Korrektur durch L-Rotation (symmetrisch: R-Rotation): Umhängen von zwei Kanten 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 L-Rotation +1 k1 0 k2 T1 A 7x T2 T3 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L-Rotation +2 k1 +1 k2 T1 T2 T3 x A 7x 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L-Rotation +2 k1 +1 k2 T1 T2 T3 x A 7x 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L-Rotation +2 k1 +1 k2 T1 T2 T3 x A 7x 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L-Rotation 0 k2 k1 0 T3 T1 A 7x T2 x 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 LR-Rotation x wird eingefügt und verletzt dadurch die Ausgeglichenheit an einem höher gelegenen Knoten k1. Notwendige Korrektur durch LR- Rotation (symmetrisch: RL-, RR- und LLRotation): Umhängen von vier Kanten 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -1 k1 0 k2 0 k3 T1 A 14x T4 T2 T3 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 +1 k2 +1 k3 T1 T4 T2 T3 x A 14x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 +1 k2 +1 k3 T1 T4 T2 T3 x A 14x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 +1 k2 +1 k3 T1 T4 T2 T3 x A 14x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 +1 k2 +1 k3 T1 T4 T2 T3 x A 14x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 -1 -1 k3 k2 T4 T3 T1 A 14x T2 x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 -1 -1 k3 k2 T4 T3 T1 A 14x T2 x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 LR-Rotation -2 k1 -1 -1 k3 k2 T4 T3 T1 A 14x T2 x 13 14 15 16 17 18 19 Diskrete Mathe 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 LR-Rotation 0 k3 0 -1 k1 k2 T2 T1 A 14x T3 x T4 19