CC G G CC Balancierte Bäume Aufwand, ein Element zu finden, entspricht der Tiefe des CC G G CC Definition für "balanciert": gefundenen Knotens es gibt verschiedene Definitionen im worst case = Tiefe des Baumes Allgemein: kein Blatt ist “wesentlich weiter“ von der Wurzel entfernt als irgendein anderes liegt zwischen log N+1 und N Hier: Für alle Knoten unterscheidet sich Anzahl der Knoten in linkem und rechtem Teilbaum höchstens um 1 Folge: ein binärer Baum der Tiefe log N+1 Tiefe: N-2 schlecht balancierte Bäume erhält man, wenn die Elemente in sortierter Reihenfolge angeliefert werden Aufwand, einen optimal balancierten Baum nach Einfüge- und Löschoperationen zu erzwingen, ist sehr groß G. Zachmann Informatik 2 - SS 06 Bäume G. Zachmann 50 CC G G CC AVL-Bäume AVL-Baum Informatik 2 - SS 06 Bäume 51 CC G G CC Minimale Knotenanzahl von AVL-Bäumen N(h) sei die minimale Anzahl von Knoten eines AVL-Baumes der Höhe h 1962 von Adelson, Velskij und Landis eingeführt schwächere Form eines balancierten Baumes Höhe Definition Balance-Faktor: bal(x) = (Höhe des rechten Unterbaumes von x) (Höhe des linken Unterbaumes von x) Definition AVL-Baum: 1 binärer Baum, wobei für jeden Knoten x gilt: bal(x) ∈ {-1,0,1} -1 Knotenzahl N(1) = 1 h=2 N(2) = 2 h=3 N(3) = 4 -1 0 0 mögliche AVL-Bäume dieser Höhe h=1 0 1 -1 0 0 0 1 0 G. Zachmann Informatik 2 - SS 06 Bäume 52 G. Zachmann Informatik 2 - SS 06 Bäume 53 1 CC G G CC CC G G CC Satz: Allgemeiner worst case Fall bei Höhe h: Beweis: 1) Induktionsanfang: h = 1 1 2) Induktionsschritt: 1 N(h-2) N(h-1) G. Zachmann Informatik 2 - SS 06 N(h-1) Bäume G. Zachmann 54 CC G G CC Minimaler AVL-Baum der Höhe 10 Informatik 2 - SS 06 N(h) Bäume 55 CC G G CC Maximale Höhe von AVL-Bäumen Erinnerung: Fibonacci-Zahlen Aus folgt nach Umformung und Abschätzung von F n die … Wichtige Eigenschaft von AVL-Bäumen: Ein AVL-Baum mit N Knoten hat höchstens die Höhe Erinnerung: Die Höhe jedes binären Baumes mit N Knoten beträgt mindestens G. Zachmann Informatik 2 - SS 06 Bäume 56 G. Zachmann Informatik 2 - SS 06 Bäume 57 2 CC G G CC AVL Search Tree CC G G CC Einfügen von Knoten Problem: wir wollen BST, der auch über viele Insert- und DeleteOperationen halbwegs gut balanciert bleibt Idee: verwende BST, der zusätzlich AVL-Eigenschaften hat Einfügen/Löschen? 10 8 +1 -1 7 0 0 3 1 8 5 0 -1 30 0 +1 20 0 3 45 35 0 25 G. Zachmann -1 4 60 3 G. Zachmann 58 +1 17 0 8 33 30 Informatik 2 - SS 06 0 33 0 39 0 Bäume -1 0 39 CC G G CC 14 3 0 +1 0 0 20 11 0 Ausgeglichenheit ist verletzt 0 Bäume 17 0 +2 33 +1 26 30 60 59 Einfügen von Knoten +1 +2 0 +1 26 G. Zachmann 17 Informatik 2 - SS 06 Einfügen von k = 30 20 0 0 0 CC G G CC 11 11 +1 0 0 0 0 20 26 Einfügen von Knoten 8 0 0 Bäume 14 +1 +1 Informatik 2 - SS 06 Einfügen von k = 30 14 Einfügen von k = 30 Problem: wie erhält man AVL-Eigenschaften bei G. Zachmann Informatik 2 - SS 06 -1 39 0 0 Bäume 61 3 CC G G CC Einfügen von Knoten 14 Einfügen von k = 30 8 3 +1 20 11 0 17 +2 0 8 33 +1 26 Ausbalancieren durch Rotation 30 G. Zachmann Informatik 2 - SS 06 -1 39 3 8 3 0 G. Zachmann 62 17 0 17 0 33 +1 26 Informatik 2 - SS 06 8 33 -1 39 39 3 63 CC G G CC +1 0 0 20 11 0 17 0 +2 26 0 33 L- Rotation 30 64 G. Zachmann Informatik 2 - SS 06 0 0 Bäume 14 0 Bäume -1 Einfügen von Knoten +2 30 Informatik 2 - SS 06 0 Einfügen von k = 30 +1 26 G. Zachmann 11 +2 30 +1 20 11 0 20 R- Rotation CC G G CC 0 0 0 0 Einfügen von Knoten 14 +1 0 Bäume Einfügen von k = 30 14 Einfügen von k = 30 0 0 CC G G CC Einfügen von Knoten Bäume 39 65 4 CC G G CC Einfügen von Knoten 14 Einfügen von k = 30 8 3 +1 20 11 0 14 Einfügen von k = 30 0 0 CC G G CC Einfügen von Knoten 17 +2 0 8 26 3 0 0 26 11 0 20 17 33 30 G. Zachmann Informatik 2 - SS 06 8 3 CC G G CC +1 20 11 0 17 G. Zachmann Informatik 2 - SS 06 0 3 33 0 39 68 67 CC G G CC +1 0 0 20 11 0 17 +1 0 0 33 0 26 0 39 Bäume 0 30 0 Bäume 14 8 0 26 33 Löschen von Knoten +1 0 0 0 Informatik 2 - SS 06 löschen von k = 8 0 0 G. Zachmann 66 Löschen von Knoten 14 0 39 Bäume löschen von k = 8 +1 G. Zachmann Informatik 2 - SS 06 0 39 Bäume 69 5 CC G G CC Löschen von Knoten löschen von k = 8 -1 14 +1 löschen von k = 11 11 3 20 0 17 +1 3 33 0 26 G. Zachmann Informatik 2 - SS 06 0 Bäume G. Zachmann 70 +1 +2 20 17 20 0 17 0 0 33 Bäume 71 CC G G CC 0 14 +2 3 20 0 17 33 0 26 0 39 Löschen von Knoten +1 0 +1 Informatik 2 - SS 06 löschen von k = 11 3 +1 0 26 CC G G CC 14 14 0 39 Löschen von Knoten löschen von k = 11 -1 11 0 0 CC G G CC Löschen von Knoten +1 0 0 33 0 26 0 39 0 39 L- Rotation G. Zachmann Informatik 2 - SS 06 Bäume 72 G. Zachmann Informatik 2 - SS 06 Bäume 73 6 CC G G CC Löschen von Knoten löschen von k = 11 0 14 +2 löschen von k = 11 3 20 17 +1 Informatik 2 - SS 06 0 0 3 33 0 26 G. Zachmann 20 0 0 14 0 0 CC G G CC Löschen von Knoten 33 0 17 0 26 0 39 0 39 Bäume G. Zachmann 74 CC G G CC AVL-Rotationen Informatik 2 - SS 06 Bäume 75 CC G G CC RR-Rotation Operationen auf AVL-Bäumen zur Erhaltung der AVL-Eigenschaft Bestehen ausschließlich aus “Umhängen” von Zeigern +1 Es gibt 2 verschiedene Arten von Rotationen k1 Single Rotation: RR und LL 0 - RR = der neue Knoten befindet sich im rechten Teilbaum des rechten k2 Teilbaums vom (jetzt) unbalancierten Knoten aus - LL = analog - wird manchmal auch einfach nur R- bzw. L-Rotation genannt Double Rotation: T1 - RL = neuer Knoten im linken Unterbaum des rechten Unterbaumes - m.a.W.: vom Knoten mit dem "schlechten" Balancefaktor muß man in den T2 T3 rechten Teilbaum gehen, dann von da aus in den linken Teilbaum, dann kommt man zu dem neu eingefügten Knoten - LR = analog G. Zachmann Informatik 2 - SS 06 Bäume 76 G. Zachmann Informatik 2 - SS 06 Bäume 77 7 CC G G CC RR-Rotation CC G G CC RR-Rotation +2 +2 k1 k1 +1 +1 k2 T1 T2 k2 T1 T3 x G. Zachmann Informatik 2 - SS 06 G. Zachmann 78 CC G G CC Informatik 2 - SS 06 Bäume 79 CC G G CC RR Rotation Algorithm def RR_Rotate (k1): k2 = k1.left k1.right = k2.left k2.left = k2 return k2 def LL_Rotate (k2): k1 = k2.left k2.left = k1.right k1.right = k2 return k1 Informatik 2 - SS 06 T3 x Bäume LL Rotation Algorithm G. Zachmann T2 Bäume 81 G. Zachmann Informatik 2 - SS 06 Bäume 82 8 CC G G CC LR-Rotation CC G G CC LR-Rotation -1 -2 -2 k1 +1 0 k1 +1 k2 k2 +1 0 +1 k3 T1 T2 k3 T4 T1 T3 T2 T4 T3 x G. Zachmann x Informatik 2 - SS 06 Bäume G. Zachmann 83 CC G G CC LR-Rotation Informatik 2 - SS 06 Bäume CC G G CC LR-Rotation -2 -2 k1 -1 k2 T4 T3 G. Zachmann T2 Informatik 2 - SS 06 k3 -1 k2 T1 k1 -1 k3 -1 84 T4 T3 x T2 T1 Bäume 85 G. Zachmann Informatik 2 - SS 06 x Bäume 86 9 CC G G CC LR-Rotation CC G G CC Code def LR_doubleRotate ( k3 ): k3.left = RR_Rotate ( k3.left ) return LL_Rotate ( k3 ) k3 0 -1 k1 k1 k2 k2 k3 0 k3 k1 k1 D T2 T1 G. Zachmann A T3 x Informatik 2 - SS 06 T4 Bäume C D neues Element x kann in B oder C sein G. Zachmann 87 def RL_doubleRotate( k1 ): k1.right = LL_Rotate( k1.right ) return RR_Rotate( k1 ) Informatik 2 - SS 06 B C (a) Before rotation CC G G CC G. Zachmann A B (b) After rotation Informatik 2 - SS 06 Bäume 88 CC G G CC Warum Double Rotation? Single Rotation kann LR oder RL nicht lösen: Bäume 89 G. Zachmann Informatik 2 - SS 06 Bäume 90 10 CC G G CC Algo-Animation http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm G. Zachmann Informatik 2 - SS 06 Bäume 91 11