Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Binärer Suchbaum III- -AVL-Baum-
2 Übersicht Binärer Suchbaum –Durchlaufstrategien Breitendurchlauf –SohnElem –SohnListe, FügeAn (hinten) –Entferne vorne –Beispiele für den Aufbau binärer Suchbäume
3 Übersicht (Fortsetzung) AVL-Baum –Definition –Balancefaktor –Einfügen von Knoten R-Rotation L-Rotation –Löschen von Knoten L-Rotation –Allgemein L-Rotation LR-Rotation
4 Binärer Suchbaum Ein binärer Baum B ist ein binärer Suchbaum, falls er leer ist oder die folgenden Eigenschaften erfüllt sind: –die beiden Unterbäume sind binäre Suchbäume –die Beschriftungen der Knoten des linken Suchbaums sind kleiner als die Beschriftung der Wurzel –die Beschriftungen des rechten Suchbaums sind größer als die Beschriftung der Wurzel n <n<n>n>n
5 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
6 Durchlaufstrategie: Breitendurchlauf Warteschlange
7 Durchlaufstrategie: Breitendurchlauf Ws
8 Durchlaufstrategie: Breitendurchlauf Ws 16
9 Durchlaufstrategie: Breitendurchlauf Ws
10 Durchlaufstrategie: Breitendurchlauf Ws
11 Durchlaufstrategie: Breitendurchlauf Ws 14
12 Durchlaufstrategie: Breitendurchlauf Ws 18
13 Durchlaufstrategie: Breitendurchlauf Ws
14 Durchlaufstrategie: Breitendurchlauf Ws
15 Durchlaufstrategie: Breitendurchlauf Ws 15
16 Durchlaufstrategie: Breitendurchlauf Ws
17 Durchlaufstrategie: Breitendurchlauf Ws
18 Durchlaufstrategie: Breitendurchlauf Ws
19 Durchlaufstrategie: Breitendurchlauf Ws
20 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()); }... } entferne Test auf Ende Durchlaufstrategie: Breitendurchlauf
21 Breitendurchlauf: SohnElem 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; } } knoten (statt int )
22 Breitendurchlauf: SohnListe, FügeAn (hinten) class SohnListe { private SohnElem kopf, fuß; void FügeAn(Knoten an) { SohnElem neu = new SohnElem(an); if (fuß != null) { fuß.SetzeWeiter(neu); fuß = neu; } else kopf = fuß = neu; }
23 Breitendurchlauf: Entferne vorne Knoten Entferne() { Knoten erster = null; if (kopf != null) { erster = kopf.GibWert(); kopf = kopf.GibWeiter(); if (kopf == null) fuss = null; } return erster;
24 Eingabefolge Eingabefolge Eingabefolge oder Eingabefolge Beispiele für den Aufbau binärer Suchbäume
25 AVL-Baum (Definition) Ein binärer Baum heißt ausgeglichener Baum oder AVL-Baum (nach Adelson-Velskij und Landis), falls sich für jeden Knoten k die Höhen h der beiden Teilbäume um höchstens 1 unterscheiden.
26 AVL-Baum: Beispiel
27 Balancefaktor Balancefaktor bal(k) bal(k) = h(rechter Teilbaum von k) - h(linker Teilbaum von k) Für AVL-Bäume gilt: bal(k)
28 AVL-Baum: Beispiel
29 AVL-Baum: Beispiel
AVL-Baum: Beispiel
31 Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Ausgeglichenheit ist verletzt Einfügen von Knoten Einfügen von k = 30
Ausbalancieren durch Rotation Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten R- Rotation Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
L- Rotation Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k = 30
Einfügen von Knoten Einfügen von k =
Einfügen von Knoten Einfügen von k =
Einfügen von Knoten
50 Löschen von Knoten Löschen von k = 8
51 Löschen von Knoten Löschen von k = 8
52 Löschen von Knoten Löschen von k = 8
53 Löschen von Knoten Löschen von k = 8
54 Löschen von Knoten Löschen von k = 8
55 Löschen von Knoten Löschen von k = 8
56 Löschen von Knoten Löschen von k = 11
57 Löschen von Knoten Löschen von k = 11
58 Löschen von Knoten Löschen von k = 11
59 Löschen von Knoten Löschen von k = 11
60 Löschen von Knoten Löschen von k = 11 L- Rotation
61 Löschen von Knoten Löschen von k = 11
62 Löschen von Knoten Löschen von k = 11
Löschen von Knoten
Löschen von Knoten
65 L-Rotation Knoten x wird eingefügt und verletzt dadurch die Ausgeglichenheit an einem höher gelegenen Knoten k 1 Notwendige Korrektur durch L-Rotation (symmetrisch: R-Rotation): Umhängen von zwei Kanten
66 L-Rotation T1T1 T2T2 T3T3 k1k1 k2k2 0 +1
67 L-Rotation T1T1 T2T2 T3T3 k1k1 k2k2 x +1 +2
68 L-Rotation T1T1 T2T2 T3T3 k1k1 k2k2 x +1 +2
69 L-Rotation T1T1 T2T2 T3T3 k1k1 k2k2 x +1 +2
70 L-Rotation T1T1 k1k1 k2k2 x 0 T2T2 T3T3 0
71 LR-Rotation x wird eingefügt und verletzt dadurch die Ausgeglichen- heit an einem höher gelegenen Knoten k 1. Notwendige Korrektur durch LR- Rotation (symmetrisch: RL-, RR- und LL- Rotation): Umhängen von vier Kanten
72 LR-Rotation T1T1 k2k2 k1k1 0 T3T3 T4T4 k3k3 T2T2 0
73 LR-Rotation T1T1 k2k2 k1k1 x T3T3 T4T4 k3k3 T2T2 +1
74 LR-Rotation k1k1 -2 T4T4 T1T1 k2k2 x +1 T3T3 k3k3 T2T2
75 LR-Rotation k1k1 -2 T1T1 k2k2 x +1 T3T3 T4T4 k3k3 T2T2
76 LR-Rotation T1T1 k2k2 k1k1 x T3T3 T4T4 k3k3 T2T2 +1
77 LR-Rotation k1k1 -2 T4T4 T1T1 k2k2 x T3T3 k3k3 T2T2
78 LR-Rotation k1k1 -2 T1T1 k2k2 x T3T3 T4T4 k3k3 T2T2
79 LR-Rotation T1T1 k2k2 k1k1 x -2 T3T3 T4T4 k3k3 T2T2
LR-Rotation T1T1 k2k2 k1k1 x 0 0 T3T3 T4T4 k3k3 T2T2