Previous Contents 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:
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;
 
       left(y):= x                // x != nil
       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


January 23, 2001
Previous Contents Next