AVL-tree

AVL-Bäume

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

Linkrotation(x)1.y←rc[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.t←new 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 t≠nil 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 h≥0 mit n Knoten gilt: (3/2)h≤n≤2h+1−1

Beweis: durch Fallunterscheidung

  • a) n≤2h+1−1 (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+1−1
  • b) (3/2)h≤n (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=1≤1.
      • h=1: Der Baum hat 2 oder 3 Knoten. Es gilt (3/2)h=3/2≤2≤3.
    • (I.V.) Für jeden AVL-Baum der Höhe j,0≤j≤h, gilt der Satz.
    • (I.S.) Sei h≥1. 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 h−1≥0.
      • 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 h−1
        3. A hat Höhe h−1 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(h−1)+1≥(32)h+(32)h−1+1≥(1+32)⋅(32)h−1≥(32)2⋅(32)h−1=(32)h+1.