Sortierte Folgen SS12
Inhaltsverzeichnis |
Bäume
Termminologie
Binäre Bäume
Binäre Suchbäume
Einfügen eines Elementes
Beim Einfügen eines Elementes macht man sich die Eigenschaft zunutze, dass der Schlüssel des linken Sohns jeweils kleiner oder gleich dem Schlussel ist, den der Knoten selbst enthält. Der rechte Kindknoten dagegen enthält einen echt größeren Schlüssel. Fügt man also einen Schlüssel in den Baum ein so beginnt man beim Vergleich mit der Wurzel. Ist der Einzufügende Schlüssel größer als der Schlüssel der Wurzel, so setzt man den Vergleich im rechten Teilbaum des aktuellen Knotens fort. Andernfalls also wenn der Schlüssel kleiner oder gleich dem Schlüssel der Wurzel ist, setzt man den Vergleich im linken Teilbaum des aktuellen Knotens fort. Trifft man bei diesem Verfahren auf einen Knoten dessen Wertigkeit null entspricht, so wird an dieser Stelle der neue Schlüssel eingefügt. Für den Programmablauf lässt sich also folgendes allgemein formulieren:
- Abfrage ob der einzufügende Schlüssel größer oder gleich dem Schlüssel von N ist
- Abfrage ob der sich daraus ergebende Kindknoten dem Wert null entspricht
- wenn ja, dann erzeuge neuen Knoten mit dem einzufügenden Schlüssel
- sonst beginne mit Schritt 1 wobei N nun N.links bzw n.rechts ist
Für die Methode zum Einfügen in einen BST ergibt sich zum einen eine rekursive sowie eine iterative Umsetzungsmöglichkeit, die im folgenden durch Pseudocode beschrieben werden.
Rekursive Umsetzung
InsertRek( Schlüssel K, Knoten N )
if Schlüssel < N.Schlüssel do
if N.links is null do
N.links = neuer Knoten
N.links.Schlüssel = K
N.links.Vater = N
else do
InsertRek( K, N.links )
else
if N.rechts is null
N.rechts = neuer Knoten
N.rechts.Schlüssel = K
N.rechts.Vater = N
else do
InsertRek( K, N.rechts ) Iterative Umsetzung
InsertIt( Schlüssel K )
Knoten p = Wurzel
Knoten o = null
while p not null
o = p
if K < p.schlüssel or K is p.schlüssel
p = p.links
else if K > p.schlüssel
p = p.rechts
else return
p = neuer Knoten
p.Schlüssel = K
p.Vater = o
if Wurzel is null
Wurzel = p
else if K < o.schlüssel or K is o.schlüssel
o.links = p
else o.rechts = pFinden eines Elementes
Finden des Minimums
Finden des Maximums
Finden des Nachfolgers
Sortierte Ausgabe des Baumes
Löschen eines Elementes
Mit einem Sohn
Mit zwei Söhnen
2-3-4-Bäume
Eigenschaften
- Knoten enthalten bis zu 3 Schlüssel
- 3-Knoten mit 3 ausgehenden Verkettungen sind zugelassen
- 4-Knoten mit 4 ausgehenden Verkettungen sind zugelassen
- Binärbaum Eigenschaften vorhanden (2-Knoten)
Suchen
Beim Suchen in 2-3-4-Bäumen verwendet man die Top-Down-Methode. Dabei folgt man ausgehend von dem kleinsten Element des Wurzelknotens der entsprechenden Verkettungen bis zum gesuchten Schlüssel. Im ersten Schritt wird dabei der gesuchte Schlüssel mit dem aktiven Element verglichen. Liefert der Vergleich eine wahre Aussage ist schon an dieser Stelle die Suche beendet. Ist dies nicht der Fall wird geprüft ob der gesuchte Schlüssel kleiner als das aktive Element im aktuellen Knoten ist. Ist dieses Kriterium wahr geht man die Verkettung vor dem aktiven Element weiter entlang und setzt das kleinste Element des Kindknotens als neues aktives Element und beginnt wieder im ersten Schritt. Im Fall, dass das Kriterium nicht erfüllt ist wird im Wurzelknoten das nächstgrößere Element aktiviert und beginnt mit diesem wieder bei Schritt eins. Sollte kein nächstes Element im aktuellen Knoten vorhanden sein wird der Verkettung nach dem zuletzt aktiven Elements zum kleinsten Element des Kindknotens gefolgt und der Erste Schritt wieder ausgeführt.
Einfügen
Günstiger Fall
Beim Einfügen wird ein Knoten solange aufgefüllt, bis er 3 Elemente enthält. Soll noch ein viertes Element aufgenommen werden ist dies nur durch ein Spalten des Knotens möglich. Dabei wird der überfüllte Knoten in 3 Teile gesplittet:
- Knoten mit zwei Elementen
- Knoten mit einem Element
- Mittleres Element
Das mittlere Element rutscht bei der Spaltung in den Elternknoten und stellt somit die Verkettung der zwei neuen Knoten dar.
Spalten
Löschen
Rot-Schwarz-Bäume
Komponenten der Knoten
- Farbe
- Schlüssel
- Adresse des Eleternknotens
- Adresse des linken Kindknotens
- Adresse des rechten Kindknotens
Eigenschaften
- Jeder Konten ist entweder rot oder schwarz
- Die Wurzel ist schwarz
- Jedes Blatt( null/ nil ) ist schwarz
- Die Kind-Knoten eines Roten Knotens sind jeweils schwarz
- Alle Pfade die von einem bestimmten Knoten ausgehen und in einem Blatt dieses Teilbaums enden, haben die gleiche Anzahl an schwarzen Knoten
Rotationen
Durch die Einfüge- und Löschoperationen kann es dazu kommen, das eine oder mehrere Eigenschaften des Rot-Schwarzbaumes verletzt werden. Um die Zeigerstruktur des Baumes zu "reparieren" bedient man sich der Rotation.