Beruflich Dokumente
Kultur Dokumente
Balancierte Bäume
GG GG
CC CC
Aufwand, ein Element zu finden, entspricht der Tiefe des 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
liegt zwischen log N+1 und N irgendein anderes
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ß
CC CC
AVL-Baum N(h) sei die minimale Anzahl von Knoten eines AVL-Baumes der
1962 von Adelson, Velskij und Landis eingeführt Höhe h
schwächere Form eines balancierten Baumes
Höhe mögliche AVL-Bäume dieser Höhe Knotenzahl
Definition Balance-Faktor:
bal(x) = (Höhe des rechten Unterbaumes von x) - h=1 N(1) = 1
(Höhe des linken Unterbaumes von x)
Definition AVL-Baum:
1 h=2 N(2) = 2
binärer Baum, wobei
-1 -1
für jeden Knoten x gilt:
bal(x) ∈ {-1,0,1} 0 0 -1 1
0 0 1 0 0 h=3 N(3) = 4
1
CC CC
GG GG
CC CC
1
2) Induktionsschritt: 1
N(h-2)
N(h-1)
N(h-1) N(h)
CC CC
Erinnerung: Fibonacci-Zahlen
2
CC CC
Problem: wir wollen BST, der auch über viele Insert- und Delete-
Operationen halbwegs gut balanciert bleibt
Idee: verwende BST, der zusätzlich AVL-Eigenschaften hat +1
Einfügen von k = 30 14
Problem: wie erhält man AVL-Eigenschaften bei
0 +1
Einfügen/Löschen?
+1
8 20
10
-1 -1 0 0 0 0
7 4 3 11 17 33
0 -1 0 +1
0
3 8 30 45 0 0
+1
0 26 39
0 0 35 0 60
1 5 20
0
25
CC CC
GG GG
+1 +1
Einfügen von k = 30 14 Einfügen von k = 30 14
0 +1
+2 0 +2
8 20 8 20
0 0 0 -1
0 0 0 0 -1
3 11 17 33 3 11 17 33
0
+1 0 +1 0
26 39 Ausgeglichenheit 26 39
ist verletzt
0 0
30 30
G. Zachmann Informatik 2 - SS 06 Bäume 60 G. Zachmann Informatik 2 - SS 06 Bäume 61
3
CC CC
GG GG
+1 +1
Einfügen von k = 30 14 Einfügen von k = 30 14
0 +2 0 +2
8 20 8 20
0 0 0 -1 0 0 0 -1
3 11 17 33 3 11 17 33
+1 0 +1 0
Ausbalancieren 26 39 26 39
durch Rotation R- Rotation
0 0
30 30
G. Zachmann Informatik 2 - SS 06 Bäume 62 G. Zachmann Informatik 2 - SS 06 Bäume 63
CC CC
GG GG
+1 +1
Einfügen von k = 30 14 Einfügen von k = 30 14
0 +2 0 +2
8 20 8 20
0 0 0 -1 0 0 0
3 11 17 33 3 11 17 26
+1 0
26 39 33
L- Rotation
0
30 30 39
G. Zachmann Informatik 2 - SS 06 Bäume 64 G. Zachmann Informatik 2 - SS 06 Bäume 65
4
CC CC
GG GG
+1 +1
Einfügen von k = 30 14 Einfügen von k = 30 14
0 +2 0 0
8 20 8 26
0
0 0 0 0 0 0
3 11 17 26 3 11 20 33
0 0
0
33 17 30 39
30 39
G. Zachmann Informatik 2 - SS 06 Bäume 66 G. Zachmann Informatik 2 - SS 06 Bäume 67
CC CC
GG GG
+1 +1
löschen von k = 8 14 löschen von k = 8 14
0 +1 0 +1
8 20 8 20
0 0
0 0 0 0 0 0
3 11 17 33 3 11 17 33
0 0 0 0
26 39 26 39
5
CC CC
GG GG
+1 +1
löschen von k = 8
-1 14 löschen von k = 11
-1 14
+1 +1
11 20 11 20
0 0
0 0 0 0
3 17 33 3 17 33
0 0 0 0
26 39 26 39
CC CC
GG GG
+1
+2 +2
löschen von k = 11
0 14 löschen von k = 11
0 14
+1 +1
3 20 3 20
0 0
0 0
17 33 17 33
0 0 0 0
26 39 26 39
L- Rotation
6
CC CC
GG GG
+2 0
löschen von k = 11
0 14 löschen von k = 11
0 20
+1 0
3 20 14
33
0 0
0 0 0
0 3 17
17 33 26 39
0 0
26 39
CC CC
AVL-Rotationen
G
RR-Rotation
G GG
CC CC
Double Rotation:
T1
- RL = neuer Knoten im linken Unterbaum des rechten Unterbaumes
T2 T3
- m.a.W.: vom Knoten mit dem "schlechten" Balancefaktor muß man in den
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 CC
RR-Rotation RR-Rotation
GG GG
CC CC
+2 +2
k1 k1
+1 +1
k2 k2
T1 T1
T2 T3 T2 T3
x x
G. Zachmann Informatik 2 - SS 06 Bäume 78 G. Zachmann Informatik 2 - SS 06 Bäume 79
CC CC
8
CC CC
LR-Rotation LR-Rotation
GG GG
CC CC
-1
-2 -2
+1
0 k1 +1 k1
k2 k2
+1
0 +1
k3 k3
T4 T4
T1 T1
T2 T3 T2 T3
x x
G. Zachmann Informatik 2 - SS 06 Bäume 83 G. Zachmann Informatik 2 - SS 06 Bäume 84
CC CC
LR-Rotation LR-Rotation
GG GG
CC CC
-2 -2
-1 k1 -1 k1
k3 k3
-1 -1
k2 k2
T4 T4
T3 T3
T1 T2 x T1 T2 x
9
CC CC
LR-Rotation
GG GG
Code
CC CC
def LR_doubleRotate ( k3 ):
k3.left = RR_Rotate ( k3.left )
return LL_Rotate ( k3 )
0
k3
k3 k2
0
k1 k1 k3
-1 k1
k2 k1
A A B C D
T3
T2 B C
CC CC
def RL_doubleRotate( k1 ):
k1.right = LL_Rotate( k1.right ) Single Rotation kann LR oder RL nicht lösen:
return RR_Rotate( k1 )
10
CC
Algo-Animation
GG
CC
http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm
11