Previous Up Next

8  Rot-schwarz-Bäume

Literatur: Kapitel 13 aus [CLR90]. Die Rot/Schwarz-Bäume wurden von [Bay72] eingeführt.
Inhalt Rot/Schwarz-Bäume ·Rotation ·Erhalt der Rot-Schwarzeigenschaft bei Einfügen und Löschen
Einführung
Definition


Definition 3   Rot/schwarz-Bäume sind binäre Suchbäume mit einem Bit Zusatzinformation: der Farbe und folgenden Bedingungen:
  1. jeder Knoten ist entweder rot oder schwarz
  2. Blätter (nil) sind schwarz
  3. die Kinder eines roten Knotens sind schwarz
  4. jeder einfache Pfad von einem gegebenen Knoten zu einem Blatt enthält die selbe Anzahl an schwarzen Knoten8

Lemma 2   Ein rot-schwarz Baum mit n internen Knoten hat eine Höhe von höchstens 2lg(n+1).
Rotation


Rotate-l(t,x) =                   // t = Baum, x = Knoten
  if    (x = nil) or (right(x) = nil)
  then  raise error "illegal rotation"
  else  y := right(x);          // rette y
        p(y) := p(x);              // ver"andere y's Verwandschaft
        if   y != nil              
        then right(x) := left(y);  // beta
        if   (left(y)) != nil
        then p(left(y)) := x;
 
        if   root(t) = x           // Spezialfall
        then root(t) := y
        else if   x = left(p(x))  // p(x) definiert
             then  left(p(x)) := y
             else right(p(x)) := y

        left(y) := x;             // zum Schluss: x als Kind von y
        p(x)    := y;               



Einfügen
Einfügen: drei Fälle (+ 3 symmetrische)
Die Graphik sind leider noch nicht nach HTML übersetzbar



insert(T,x) 
  tree_insert(T,x);                          // normal einfuegen 
  color(x)  := red                           // am Anfang rot
 
  while x != root(t) and color(p(x)) = red   // Rot-verletzung
  do
    if  p(x) = left(p(p(x));                 // Vater ist linker Sohn
       then  y := right(p(p(x))              // y = Onkel, d.h.
                                             // rechter Sohn des Opas
             if  color(y) = red              // Onkel rot
                then  color(p(x))  := black; // => umfaerben
                      color(y)     := black;
                     color(p(p(x)) := red;
                                 x := p(p(x))
                else if x = right(p(x))      // Onkel schwarz
                        then x := p(x);      // x ist rechtes Kind
                             left_rotate(T,x) 

                     color(p(x)) := black;   // Vater <- schwarz
                     color(p(p(x)) := red;   // Opa   <- rot
                    right_rotate(T,p(p(x))); // Ausgleich
        else ....... // analog
  done;
  color(root(T)) := black;



Löschen

Siehe Übung


Page last (re-)generated May 21, 2003 (Martin Steffen)
Previous Up Next