G. Zachmann Informatik 2 - SS 06 Bäume 50
C G C C G C
Tiefe: N-2
Balancierte Bäume
Aufwand, ein Element zu finden, entspricht der Tiefe des gefundenen Knotens
im worst case = Tiefe des Baumes
liegt zwischen log N+1 und N
C G C C G C
Definition für "balanciert":
es gibt verschiedene Definitionen
Allgemein: kein Blatt ist “wesentlich weiter“ von der Wurzel entfernt als 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
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 52
C G C C G
AVL-Bäume
C AVL-Baum
1962 von Adelson, Velskij und Landis eingeführt
schwächere Form eines balancierten Baumes
Definition Balance-Faktor:
bal(x) = (Höhe des rechten Unterbaumes von x) - (Höhe des linken Unterbaumes von x)
Definition AVL-Baum:
binärer Baum, wobei für jeden Knoten x gilt:
bal(x) ∈ {-1,0,1}
0 0
0 0
-1
0
1 0
-1
0 1 -1 1
C G C C G C
h = 1 N(1) = 1
h = 2 N(2) = 2
h = 3 N(3) = 4
Minimale Knotenanzahl von AVL-Bäumen
N(h) sei die minimale Anzahl von Knoten eines AVL-Baumes der Höhe h
Höhe mögliche AVL-Bäume dieser Höhe Knotenzahl
G. Zachmann Informatik 2 - SS 06 Bäume 54
C G C C G C
N(h-2)
N(h-1) 1
Allgemeiner worst case Fall bei Höhe h:
C G C C G C
Satz:
Beweis:
1) Induktionsanfang: h = 1
2) Induktionsschritt:
N(h) N(h-1)
1
G. Zachmann Informatik 2 - SS 06 Bäume 56
C G C C G
Minimaler AVL-Baum der Höhe 10
CC G C C G
Maximale Höhe von AVL-Bäumen
C 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 58
C G C C G
AVL Search Tree
C 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
Problem: wie erhält man AVL-Eigenschaften bei Einfügen/Löschen?
0 0
0 0
-1
0
+1 0
-1
0 +1 -1 10 +1
7
3 8
1 5
30
4 0
20 25
35
45 60
C G C C G C
Einfügen von k = 30
0 0 0
0 0 0
0 +1
+1
26 39 17
11 3
20 8
33 14
Einfügen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 60
C G C C G C
Einfügen von k = 30
0 0 0
0 0 0
0 +1
+1
26 39 17
11 3
20 8
33 14
30 0 +1
-1 +2
Einfügen von Knoten
C G C C G C
+1 -1 +2
Einfügen von k = 30
0 0
0 0
0
+1
26 39 17
11 3
20 8
33 14
30 0
Ausgeglichenheit
ist verletzt
Einfügen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 62
C G C C G C
+1 -1 +2
Einfügen von k = 30
0 0
0 0
0
+1
26 39 17
11 3
20 8
33 14
30 0
Ausbalancieren durch Rotation Einfügen von Knoten
C G C C G C
+1 -1 +2
Einfügen von k = 30
0 0
0 0
0
+1
26 39 17
11 3
20 8
33 14
30 0
R- Rotation
Einfügen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 64
C G C C G C
+1 -1 +2
Einfügen von k = 30
0 0
0 0
0
+1
26 39 17
11 3
20 8
33 14
30 0
Einfügen von Knoten
C G C C G C
+2
Einfügen von k = 30
0
0 0
0
+1
33 17
11 3
20 8
26 14
30 39
L- Rotation
Einfügen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 66
C G C C G C
+2
Einfügen von k = 30
0
0 0
0
+1
33 17
11 3
8
14
30 39 26
20
Einfügen von Knoten
C G C C G C
0
Einfügen von k = 30
0
0 0
0
+1
20 11
3
8
14
33 30 39 17
26
0
0 0 0
Einfügen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 68
C G C C G C
+1
löschen von k = 8
0
0 0
0
+1
17 11
3
8
14
33 26 39 20
0 0 0
Löschen von Knoten
C G C C G C
+1
löschen von k = 8
0
0 0
0
+1
17 3
8
14
33 26 39 20
0 0 0 11
Löschen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 70
C G C C G C
+1
löschen von k = 8
0 0
-1
+1
17 3
11
14
33 26 39 20
0 0 0
Löschen von Knoten
C G C C G C
+1
löschen von k = 11
0 0
-1
+1
17 3
11
14
33 26 39 20
0 0 0
Löschen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 72
C G C C G C
+1
löschen von k = 11
0 0
+1
17 3
14
33 26 39 20
0 0 0 +2
Löschen von Knoten
C G C C G C
+2
+1
löschen von k = 11
0 0
17 3
14
33 26 39 20
0 0 0
L- Rotation
Löschen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 74
C G C C G C
+2
+1
löschen von k = 11
0 0
17 3
14
33 26 39 20
0 0 0
Löschen von Knoten
C G C C G C
0
löschen von k = 11
0 14
20
0 33 26 39 0 0
3 17
0 0
Löschen von Knoten
G. Zachmann Informatik 2 - SS 06 Bäume 76
C G C C G
AVL-Rotationen
C Operationen auf AVL-Bäumen zur Erhaltung der AVL-Eigenschaft
Bestehen ausschließlich aus “Umhängen” von Zeigern
Es gibt 2 verschiedene Arten von Rotationen
Single Rotation : RR und LL
- RR = der neue Knoten befindet sich im rechten Teilbaum des rechten Teilbaums vom (jetzt) unbalancierten Knoten aus
- LL = analog
- wird manchmal auch einfach nur R- bzw. L-Rotation genannt
Double Rotation :
- RL = neuer Knoten im linken Unterbaum des rechten Unterbaumes - 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
C G C C G C
T 1
T 2 T 3 k 1
k 2
0
+1
RR-Rotation
G. Zachmann Informatik 2 - SS 06 Bäume 78
C G C C G C
T 1
T 2 T 3 k 1
k 2 +1 +2
RR-Rotation
x
C G C C G C
T 1
T 2 T 3 k 1
k 2 +1 +2
RR-Rotation
x
G. Zachmann Informatik 2 - SS 06 Bäume 81
C G C C G
LL Rotation Algorithm
Cdef LL_Rotate (k2):
k1 = k2.left k2.left = k1.right k1.right = k2 return k1
C G C C G C
def RR_Rotate (k1):
k2 = k1.left k1.right = k2.left k2.left = k2 return k2
RR Rotation Algorithm
G. Zachmann Informatik 2 - SS 06 Bäume 83
C G C C G C
T 1
k 2
k 1 +1
-2
T 3
T 4 k 3
T 2
+1
x -1 0
0 LR-Rotation
C G C C G C
T 1
k 2
k 1 +1
-2
T 3
T 4 k 3
T 2
+1
x
LR-Rotation
G. Zachmann Informatik 2 - SS 06 Bäume 85
C G C C G C
-2
T 1
k 3
k 1 -1
-2
T 3 T 4
k 2
T 2 -1
x LR-Rotation
C G C C G C
-2
T 1
k 3
k 1 -1
-2
T 3 T 4
k 2
T 2 -1
x
LR-Rotation
G. Zachmann Informatik 2 - SS 06 Bäume 87
C G C C G C
k 3
T 1
k 1 0 0
T 3
T 4 k 2
T 2 -1
x LR-Rotation
C G C C G C
def LR_doubleRotate ( k3 ):
k3.left = RR_Rotate ( k3.left ) return LL_Rotate ( k3 )
k
3k
1k
1k
2k
1k
3A
D
B C
C B
A D
(a) Before rotation (b) After rotation neues Element x kann in B oder C sein
Code
G. Zachmann Informatik 2 - SS 06 Bäume 89
C G C C G C
def RL_doubleRotate( k1 ):
k1.right = LL_Rotate( k1.right ) return RR_Rotate( k1 )
C G C C G
Warum Double Rotation?
C Single Rotation kann LR oder RL nicht lösen:
G. Zachmann Informatik 2 - SS 06 Bäume 91
C G C C G