AVL-tree

AVL-Bäume

!introprog-v11-baeume-avl, p.53

Linkrotation(x)1.yrc[x]2.rc[x]lc[y]3.if lc[y]nil then p[lc[y]]x4.p[y]p[x]5.if p[x]=nil then root[T]y6.else if x=lc[p[x]] then lc[p[x]]y7.else rc[p[x]]y8.lc[y]x9.p[x]y

Beinahe-AVL-Baum

Definition:

Ein Baum heißt beinahe-AVL-Baum, wenn die AVL-Eigenschaft in jedem Knoten außer der Wurzel erfüllt ist und sich die Höhe der Unterbäume der Wurzel um höchstens 2 unterscheidet.

Balance(y)1.if h[lc[y]]>h[rc[y]]+1 then2.if h[lc[lc[y]]]<h[rc[lc[y]]] then3.Linkrotation(lc[y])4.Rechtsrotation(y)5.else if h[rc[y]]>h[lc[y]]+1 then6.if h[rc[rc[y]]]<h[lc[rc[y]]] then7.Rechtsrotation(rc[y])8.Linkrotation(y)

Fall 1: Einfache Rechtsrotation

!introprog-v11-baeume-avl, p.71

Fall 2: Doppelrotation

Operationen

Notes

Einfügen

AVL-Einfügen(t,x)1.if t=nil then2.tnew node(x);h[t]0;return3.else if x<key[t] then AVL-Einfügen(lc[t],x)4.else if x>key[t] then AVL-Einfügen(rc[t],x)5.else return Schlüssel schon vorhanden6.h[t]1+max{h[lc[t]],h[rc[t]]}7.Balance(t)

logarithmische Laufzeit: O(h) = O(log n)

Löschen

AVL-Löschen(t,x)01.if t=nil then return x nicht im Baum02.else if x<key[t] then AVL-Löschen(lc[t],x)03.else if x>key[t] then AVL-Löschen(rc[t],x)04.else if lc[t]=nil then ersetze t durch rc[t]05.else if rc[t]=nil then ersetze t durch lc[t]06.else u=MaximumSuche(lc[t])07.Kopiere Informationen von u nach t08.AVL-Löschen(lc[t],key[u])09.if tnil then h[t]=1+max{h[lc[t]],h[rc[t]]}10.Balance(t)

Beweis für Höhe

Satz:

Für jeden AVL-Baum der Höhe h0 mit n Knoten gilt: (3/2)hn2h+11

Beweis: durch Fallunterscheidung

  • a) n2h+11 (obere Schranke)
    • AVL-Baum ist Binärbaum
    • Ein vollständiger Binärbaum hat eine maximale Anzahl Knoten unter allen Binärbäumen der Höhe h
    • N(h) = Anzahl Knoten eines vollständigen Binärbaums der Höhe h
    • N(h)=1+2+3+4+2k=i=0h2i=2h+11
  • b) (3/2)hn (untere Schranke)
    • Beweis per Induktion über die Struktur von AVL-Bäumen
    • (I.A.) Wir betrachten alle AVL-Bäume der Höhe 0 und 1.
      • h=0: Der Baum hat einen Knoten. Es gilt (3/2)h=11.
      • h=1: Der Baum hat 2 oder 3 Knoten. Es gilt (3/2)h=3/223.
    • (I.V.) Für jeden AVL-Baum der Höhe j,0jh, gilt der Satz.
    • (I.S.) Sei h1. Betrachte AVL-Baum T der Höhe h+1 mit Wurzel v.
      • Seien A,B linker bzw. rechter Teilbaum von v.
      • A oder B (oder beide) hat Tiefe h.
      • Wegen AVL-Eigenschaft haben A und B Tiefe mindestens h10.
      • Da T ein AVL-Baum ist, sind auch A und B AVL-Bäume.
      • Wir können (I.V.) anwenden, da A und B AVL-Bäume der Tiefe 0 sind
      • Es gibt drei Fälle:
        1. A,B haben Höhe h
        2. A hat Höhe h und B hat Höhe h1
        3. A hat Höhe h1 und B hat Höhe h
      • Sei T(h) die minimale Anzahl Knoten in einem AVL-Baum der Tiefe h.
      • Nach (I.V.) gilt in allen drei Fällen
T(h+1)T(h)+T(h1)+1(32)h+(32)h1+1(1+32)(32)h1(32)2(32)h1=(32)h+1.