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