Balancierte binäre Suchbäume

Werbung
Balancierte binäre Suchbäume
Problem:
• Gegeben sind n Objekte O1,.., O n mit zugehörigen
Schlüsseln s(O i )
Operationen:
• Suche(k); Ausgabe O mit Schlüssel s(O) =k;
nil, falls kein Objekt mit Schlüssel k in Datenbank
• Einfügen(O); Einfügen von Objekt O in Datenbank
• Löschen(O); Löschen von Objekt O mit aus der
Datenbank
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
1
Balancierte binäre Suchbäume
Binäre Suchbäume:
• Ausgabe aller Elemente in O(n)
• Suche, Minimum, Maximum, Nachfolger in O(h)
• Einfügen, Löschen in O(h)
Frage:
• Wie kann man eine „kleine“ Höhe trotz Einfügen und
Löschen garantieren?
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
2
Balancierte binäre Suchbäume
AVL-Bäume (nach Adelson-Velsky & Landis, 1962)
• Ein Baum heißt AVL-Baum, wenn für jeden Knoten gilt:
Die Höhe seines linken und rechten Teilbaums
unterscheidet sich höchstens um 1.
3
1
2
2
0
0
1
0
SS 2008
1
0
1
0
Zusätzliches Satelitendatum: Höhe h[x]
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
3
Balancierte binäre Suchbäume
Satz 12.1
Für jeden AVL-Baum der Höhe h mit n Knoten gilt:
(3/2)h ≤ n ≤ 2h+1 - 1
Korollar 12.2
Ein AVL-Baum mit n Knoten hat Höhe Θ(log n).
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
4
Balancierte binäre Suchbäume
Dynamische AVL-Bäume
Nach Korollar 12.2
h = Θ(log n)
• Operationen Suche, Einfügen, Löschen, gilt
Min/Max,
Vorgänger/Nachfolger,… wie in der letzten Vorlesung
• Laufzeit O(h) für diese Operationen
Problem:
• Einfügen/Löschen verändert Struktur des Baums!
Idee:
• Wir brauchen Prozedur, um AVL-Eigenschaft nach
Einfügen/Löschen wiederherzustellen.
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
5
Balancierte binäre Suchbäume
Diese Rotationen erhalten
die Suchbaumeigenschaft!
Rotationen:
y
x
x
C
A
SS 2008
y
Rechtsrotation(T,y)
Linksrotation(T,x)
A
B
B
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
C
6
Balancierte binäre Suchbäume
Beispiel 1:
15
y
9
7
x
17
SS 2008
15
21
Rechtsrotation(T,y)
27
19
19
9
7
x
21 y
17
27
20
20
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
7
Balancierte binäre Suchbäume
Beispiel 2:
y
x
21
15
21
9
17
SS 2008
20
x
Linksrotation(T,x)
27
19
7
y
9
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
27
15
19
17
20
8
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7.
else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
10. h[x] ← 1+ max{h[lc[x]],h[rc[x]]}
11. h[y] ← 1+ max{h[lc[y]],h[rc[y]]}
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
9
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7.
else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
10. h[x] ← 1+ max{h[lc[x]],h[rc[x]]}
11. h[y] ← 1+ max{h[lc[y]],h[rc[y]]}
SS 2008
Im folgenden Beispiel werden die
Zeilen 10 und 11 nicht betrachtet
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
10
Balancierte binäre Suchbäume
Annahme: x hat
rechtes Kind.
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
11
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
27
19
7
17
20
12
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
y
17
20
13
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
y
17
20
14
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
y
17
20
15
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
y
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
nil
17
20
16
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
x
15
21
9
y
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
nil
17
20
17
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
root[T]
x
15
21
9
y
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
nil
17
20
18
Balancierte binäre Suchbäume
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
root[T]
x
15
21
9
y
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
nil
17
20
19
Balancierte binäre Suchbäume
root[T]
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
nil
21
y
x
15
9
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
17
20
20
Balancierte binäre Suchbäume
root[T]
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
SS 2008
nil
21
y
x
15
9
27
19
7
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
17
20
21
Balancierte binäre Suchbäume
root[T]
Linksrotation(T,x)
Laufzeit: O(1)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
9
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
7
8. lc[y] ← x
9. p[x] ← y
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
nil
21
y
x
15
27
19
17
20
22
Balancierte binäre Suchbäume
Definition:
• Ein Baum heißt beinahe-AVL-Baum, wenn die AVLEigenschaft in jedem Knoten außer der Wurzel erfüllt ist
und die Höhe der Unterbäume der Wurzel um höchstens
2 unterscheidet.
Idee:
• Umformen eines beinahe-AVL-Baums in einen AVLBaum mit Hilfe von Rotationen
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
23
Balancierte binäre Suchbäume
Fall 1:
y
x
H-1
C
H
A
SS 2008
B
H oder
H-1
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
24
Balancierte binäre Suchbäume
Fall 1:
y
Rechtsrotation(T,y)
x
y
x
C
H
A
SS 2008
B
H oder
H-1
H-1 H
A
H oder
H-1
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
H-1
B
C
25
Balancierte binäre Suchbäume
Fall 2:
y
x
H-1
C
H
H-1
A
SS 2008
B
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
26
Balancierte binäre Suchbäume
Fall 2:
y
x
H-1
C
H
H-1
A
SS 2008
B
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
27
Balancierte binäre Suchbäume
Fall 2:
y
x
H-1
C
z
H
H-1
A
H-2
oder
H-1
SS 2008
B‘
B‘‘
H-2
oder
H-1
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
28
Balancierte binäre Suchbäume
Fall 2:
y
y
Linksrotation(T,x)
z
x
H-1
H-1
C
C
x
z
B‘‘
H
H-1
A
H-2
oder
H-1
SS 2008
B‘
B‘‘
H-2
oder H-1
H-1
B‘
A
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
H-2
oder
H-1
H-2
oder
H-1
29
Balancierte binäre Suchbäume
Fall 2:
z
y
(Fortsetzung)
Rechtsrotation(T,x)
z
x
y
H-1
C
x
B‘‘
H-1
B‘
A
SS 2008
H-2
oder
H-1
H-2
oder
H-1
B‘
B‘‘
C
A
Fälle 3 und 4 (rechter
Teilbaum höher) analog.
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
30
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
y
x
H-1
C
H
A
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
B
H oder
H-1
31
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
y
x
H-1
C
H
A
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
B
H oder
H-1
32
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
y
x
H-1
C
H
A
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
B
H oder
H-1
33
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
y
x
H-1
C
H
A
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
B
H oder
H-1
34
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
x
y
A
B
C
35
Balancierte binäre Suchbäume
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Laufzeit: O(1)
x
y
A
B
C
36
Balancierte binäre Suchbäume
Kurze Zusammenfassung:
• Wir können aus einem beinahe-AVL-Baum mit Hilfe von
maximal 2 Rotationen einen AVL-Baum machen
• Dabei erhöht sich die Höhe des Baums nicht
Einfügen:
• Wir fügen ein wie früher
• Dann laufen wir den Pfad zur Wurzel zurück
• An jedem Knoten balancieren wir, falls der Unterbaum
nur ein beinahe-AVL-Baum ist
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
37
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
38
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden t
8
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Einfügen 2
9
6
39
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden t
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
40
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
5
7. Balance(t)
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
41
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
5
7. Balance(t)
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
42
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
t
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
43
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
t
3
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
8 Einfügen 2
9
6
44
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
t
SS 2008
8 Einfügen 2
9
6
nil
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
45
Balancierte binäre Suchbäume
Neuen Knoten erzeugen.
Zusätzlich noch Zeiger
lc[t] und rc[t] auf nil
setzen, sowie p[t] und
den Zeiger (lc oder rc)
von p[t] auf t setzen.
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
t
SS 2008
8 Einfügen 2
9
6
2
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
46
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
h[nil] definieren wir als -1.
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
8
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
t
SS 2008
Einfügen 2
9
6
2
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
47
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
t
SS 2008
8 Einfügen 2
9
6
2
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
48
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
t
3
8 Einfügen 2
9
6
2
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
49
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
5
7. Balance(t)
3
8 Einfügen 2
9
6
2
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
50
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden t
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
8 Einfügen 2
9
6
2
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
51
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden t
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
3
7. Balance(t)
2
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
6
5 Einfügen 2
8
9
52
Balancierte binäre Suchbäume
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
3
7. Balance(t)
2
Laufzeit:
5 Einfügen 2
8
6
9
• O(h) = O(log n)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
53
Balancierte binäre Suchbäume
Korrektheit (Skizze):
• Vollständige Induktion über die Länge des Suchpfads
(startend vom eingefügten Blatt bis zur Wurzel):
– Einfügen in einen leeren Baum T funktioniert
– Wenn T nicht leer, dann wird x in einen der
Teilbäume T1,T2 der Wurzel eingefügt
– Ind. Ann.: T1,T2 bereits AVL-Bäume
– T1,T2 unterscheiden sich in Höhe um max. 2
– Also T entweder AVL-Baum oder zumindest
beinahe-AVL-Baum
– Balance(T) garantiert AVL-Eingenschaft
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
T
T2
T1
x
54
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
5
3
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
55
Balancierte binäre Suchbäume
k bezeichnet Schlüssel
des zu löschenden
Elements.
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
5
3
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
56
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
t
5
3
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
57
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
10.Balance(t)
Löschen(3)
5
3
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
58
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
Und die anderen
2. else if k>key then AVL-Löschen(rc[t],l)
Zeiger aktualisieren
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
Löschen(3)
8.
AVL-Löschen(lc[t],key[u])
5
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
8
nil
10.Balance(t)
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
59
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
Oder h[t]=-1,
7.
Kopiere Informationen von ufalls
nach
t=nil t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
t
10.Balance(t)
Löschen(3)
5
8
nil
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
60
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
Nichts zu tun,
da Baum leer.
9. h[t] = 1 + max{h[lc[t]],
h[rc[t]]}
t
10.Balance(t)
Löschen(3)
5
8
nil
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
61
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
t
5
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
62
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
5
Löschen(3)
t
8
9
6
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
63
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5 t
3
8
9
6
7
64
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5 t
3
8
9
6
7
65
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
8
t
9
6
7
66
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
8
t
9
6
7
67
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
8
t
9
6
lc[t]
7 u
68
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
8
7
t
9
6
lc[t]
7 u
69
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
7
t
9
6
lc[t]
7 u
70
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
7
t
9
6
lc[t]
71
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
7
t
9
6
lc[t]
72
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5 t
3
7
9
6
73
Balancierte binäre Suchbäume
AVL-Löschen(t,k)
1. if k<key[t] then AVL-Löschen(lc[t],k)
2. else if k>key then AVL-Löschen(rc[t],k)
3. else if t=nil then return k nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch lc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(lc[t],key[u])
2
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Laufzeit: O(h) = O(log n)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
Löschen(8)
5
3
7
9
6
74
Balancierte binäre Suchbäume
Korrektheit:
• Ähnlich wie beim Einfügen
Satz 12.3
Mit Hilfe von AVL-Bäumen kann man Suche, Einfügen,
Löschen, Minimum und Maximum in einer Menge von n
Zahlen in Θ(log n) Laufzeit durchführen.
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
75
Balancierte binäre Suchbäume
Zusammenfassung und Ausblick:
• Effiziente Datenstruktur für das Datenbank Problem mit
Hilfe von Suchbäumen
• Kann man eine bessere Datenstruktur finden?
• Was muss man ggf. anders machen?
(untere Schranke für vergleichsbasierte Strukturen)
SS 2008
Datenstrukturen und Algorithmen
12.Balancierte Binärbäume
76
Herunterladen