Wiederholung – Elementare Datenstrukturen Definition 11.1: Eine dynamische Menge ist gegeben durch eine oder mehrer Mengen von Objekten sowie Operationen auf diesen Mengen und den Objekten der Mengen. Dynamische Mengen werden auch abstrakte Datentypen (ADT) genannt. Definition 11.2: 1. Werden auf einer Menge von Objekten die Operationen Einfügen, Entfernen und Suchen betrachtet, so spricht man von einem Wörterbuch. 2. Werden auf einer Menge von Objekten die Operationen Einfügen, Entfernen und Suchen des Maximums betrachtet, so spricht man von einer Warteschlange. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 1 Wiederholung – Datenstrukturen Ein grundlegendes Datenbank-Problem • Speicherung von Datensätzen Beispiel: • Kundendaten (Name, Adresse, Wohnort, Kundennummer, offene Rechnungen, offene Bestellungen,…) Anforderungen: • Schneller Zugriff • Einfügen neuer Datensätze • Löschen bestehender Datensätze SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 2 Objekte in dynamischen Mengen (1) Objekte bestehen aus verschiedenen Feldern. Ein Feld speichert den Schlüssel des Objekts. Identifikation eines Objekts erfolgt über Schlüssel. Schlüssel von Objekten sind nicht notwendig paarweise verschieden. Falls Schlüssel paarweise verschieden sind, ist Menge von Objekten identisch zur Menge von Schlüsseln. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 3 Objekte in dynamischen Mengen (2) Weitere Felder relevant für Datenstruktur, z.B. Felder für Referenzen auf andere Objekte. Andere Felder nur relevant für Anwendung, nicht für Datenstruktur – die Daten dieser Felder nennt man Satellitendaten. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 4 Wiederholung – Datenstrukturen Zugriff auf Daten: • Jedes Objekt hat einen Schlüssel • Eingabe des Schlüssels liefert Datensatz • Schlüssel sind vergleichbar (es gibt totale Ordnung der Schlüssel) Beispiel: • Kundendaten (Name, Adresse, Kundennummer) • Schlüssel: Name • Totale Ordnung: Lexikographische Ordnung SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 Datenstrukturen Zugriff auf Daten: • Jedes Objekt hat einen Schlüssel • Eingabe des Schlüssels liefert Datensatz • Schlüssel sind vergleichbar (es gibt totale Ordnung der Schlüssel) Beispiel: • Kundendaten (Name, Adresse, Kundennummer) • Schlüssel: Kundennummer • Totale Ordnung: ‚≤‘ SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 6 Datenstrukturen Datenstruktur Array: • Platzbedarf Θ(max) • Laufzeit Suche: Θ(n) • Laufzeit Einfügen/Löschen: Θ(1) Vorteile: • Schnelles Einfügen und Löschen Nachteile: • Speicherbedarf abhängig von max (nicht vorhersagbar) • Hohe Laufzeit für Suche SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 Stacks (Stapel) und Queues (Schlangen) Definition 11.4: 1. Stacks (Stapel) sind eine Datenstruktur, die die dynamische Menge LIFO (last-in-first-out) implementiert. In LIFOs sollen beliebige Objekte eingefügt und das zuletzt eingefügte Objekt ernfernt werden können. 2. Queues (Schlangen) sind eine Datenstruktur, die die dynamische Menge FIFO (first-in-first-out) implementiert. In FIFOs sollen beliebige Objekte eingefügt und das am längsten in der Menge befindliche Objekt ernfernt werden können. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 8 Doppelt verkettete Listen (1) Verkettete Listen bestehen aus einer Menge linear angeordneter Objekte. Anordnung realisiert durch Verweise. Unterstützen alle dynamischen Mengen mit den Operationen Insert, Delete, Search, Search-Minimum, usw. Unterstützung ist nicht unbedingt effizient. Objekte in doppelt verketteter Liste L besitzen mindestens drei Felder: key, next, prev. Außerdem Felder für Satellitendaten möglich. Zugriff auf Liste L durch Verweis/Zeiger head[L]. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 Doppelt verkettete Listen (2) head[L] verweist auf erstes Element der Liste L. x Objekt in Liste L: next[x] verweist auf nächstes Element in Liste, prev[L] verweist auf voriges Element in Liste. prev[x]=NIL: x besitzt keinen Vorgänger. Dann ist x erstes Element der Liste und head[L] verweist auf x. next[x]=NIL: x besitzt keinen Nachfolger. Dann ist x letztes Element der Liste. head[L]=NIL: Liste L ist leer. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 10 Varianten verketteter Listen Einfach verkettete Listen: Feld prev nicht vorhanden. Sortierte verkettete Liste: Schlüssel können sortiert werden. Reihenfolge in Liste entspricht sortierter Reihenfolge der Schlüssel. zykisch/kreisförmig verkettete Listen: next des letzten Objekts zeigt auf erstes Objekt. prev des ersten Objekts zeigt auf letztes Objekt. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 11 Doppelt verkettete Listen - Beispiel Schlüssel head[L] / 9 16 prev 4 1 / 4 1 next zyklisch doppelt verkette Liste: head[L] SS 2009 9 16 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 12 Doppelt verkettete Listen Datenstruktur Liste: • Platzbedarf Θ(n) • Laufzeit Suche: Θ(n) • Laufzeit Einfügen/Löschen: Θ(1) Vorteile: • Schnelles Einfügen/Löschen • O(n) Speicherbedarf Nachteile: • Hohe Laufzeit für Suche SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 13 Vereinfachung durch Sentinels (Wächter) Vermeidung von Abfragen head[L] ≠ NIL und x ≠ NIL durch Einfügen eines zusätzlichen Objekts nil[L]. nil[L] besitzt drei Felder key, prev, next, aber key[nil[L]]= NIL. next[nil[L]] verweist auf erstes (richtiges) Objekt in Liste. prev[nil[L]] verweist auf letztes Objekt in Liste. Ersetzten in Pseudocode NIL durch nil[L]. head[L] nicht mehr benötigt, ersetzt durch next[nil[L]]. Objekt zur Vereinfachung von Randbedingungen wird Sentinel oder Wächter genannt. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 14 Zyklisch verkette Listen mit Sentinel nil [L] nil [L] / 9 16 4 nil [L] / 25 9 16 4 nil [L] / 25 9 16 1 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 1 15 Doppelt verkettete Listen - Beispiel Drei grundlegende Datenstrukturen • Array • Stack/Queue • (doppelt) verkettete Liste Diskussion • Alle drei Strukturen haben gewichtige Nachteile • Suche: Θ(n) • Zeiger/Referenzen helfen beim Speichermanagement SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 16 Binäre Bäume Neben Felder für Schlüssel und Satellitendaten Felder p, lc, rc. x Knoten: p[x] Verweis auf Elternknoten, lc[x] Verweis auf linkes Kind, rc[x] Verweis auf rechtes Kind. Falls p[x]=NIL, dann ist x Wurzel des Baums. lc[x] / rc[x]=NIL: kein linkes/rechtes Kind. Zugriff auf Baum T durch Verweis root[T] auf Wurzelknoten. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 17 Binäre Bäume - Illustration root[T] / / / / / / / / / / SS 2009 / / / Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 18 Allgemeine Bäume Darstellung für binäre Bäume auch möglich für k-näre Bäume, k fest. Ersetze lc[x]/rc[x] durch child1[x],..,childk[x]. Bei Bäumen mit unbeschränktem Grad nicht möglich, oder ineffizient, da Speicher für viele Felder reserviert werden muss. Nutzen linkes-Kind/rechtes-Geschwister- Darstellung. Feld p für Eltern bleibt. Dann Feld left-child für linkes Kind und Feld right-sibling für rechtes Geschwister. SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 19 Allgemeine Bäume root[T] / / / / SS 2009 / / / Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen / / / 20 Binäre Suchbäume Binäre Suchbäume • Verwende Binärbaum • Speichere Schlüssel „geordnet“ Binäre Suchbaumeigenschaft: • Sei x Knoten im binären Suchbaum • Ist y Knoten im linken Unterbaum von x, dann gilt key[y]≤key[x] • Ist y Knoten im rechten Unterbaum von x, dann gilt key[y]≥key[x] SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 21 Binäre Suchbäume Unterschiedliche Suchbäume • Schlüsselmenge 4,6,7 • Wir erlauben mehrfache Vorkommen desselben Schlüssels 4 6 4 7 6 7 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 22 Binäre Suchbäume Ausgabe aller Schlüssel • Gegeben binärer Suchbaum • Wie kann man alle Schlüssel aufsteigend sortiert in Θ(n) Zeit ausgeben? 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 23 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 24 Binäre Suchbäume Aufruf über Inorder-Tree-Walk(x) Inorder-Tree-Walk(root[T]) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 6 4. Inorder-Tree-Walk(rc[x]) 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 25 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 26 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 27 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 28 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 29 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 30 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] Kein linkes Kind 4. Inorder-Tree-Walk(rc[x]) vorhanden, d.h. lc[x]=nil 6 7 4 x 3 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 31 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] Kein linkes Kind 4. Inorder-Tree-Walk(rc[x]) vorhanden, d.h. lc[x]=nil 6 7 4 x 3 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 32 Binäre Suchbäume Ausgabe: 3 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 33 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] Kein rechtes Kind 4. Inorder-Tree-Walk(rc[x]) vorhanden, d.h. 4 rc[x]=nil Ausgabe: 3 6 3 7 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 34 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] Kein rechtes Kind 4. Inorder-Tree-Walk(rc[x]) vorhanden, d.h. 4 rc[x]=nil Ausgabe: 3 6 3 7 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 35 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) Knoten 4 abgearbeitet Ausgabe: 3 6 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 7 9 36 Binäre Suchbäume Ausgabe: 3, 4 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 37 Binäre Suchbäume Ausgabe: 3, 4 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 nil Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 38 Binäre Suchbäume Ausgabe: 3, 4 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 nil Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 39 Binäre Suchbäume Ausgabe: 3, 4 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 40 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 41 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 42 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 43 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 44 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 45 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 46 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 47 Binäre Suchbäume Ausgabe: 3, 4, 6, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 48 Binäre Suchbäume Ausgabe: 3, 4, 6, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 49 Binäre Suchbäume Ausgabe: 3, 4, 6 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 9 7 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 50 Binäre Suchbäume Ausgabe: 3, 4, 6, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 51 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 52 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 53 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 54 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 55 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 9 7 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 56 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 57 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 58 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 7 9 nil SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 59 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 60 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 61 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 62 Binäre Suchbäume Ausgabe: 3, 4, 6, 7, 7, 9 Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) 6 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 63 Binäre Suchbäume Inorder-Tree-Walk(x) 1. if x≠nil then 2. Inorder-Tree-Walk(lc[x]) 3. Ausgabe key[x] 4. Inorder-Tree-Walk(rc[x]) SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen Laufzeit Θ(n) 64 Binäre Suchbäume Suchen in Binärbäumen • Gegeben ist Schlüssel k • Gesucht ist ein Knoten mit Schlüssel k SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 65 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 66 Binäre Suchbäume Aufruf mit Baumsuche(x,k) x=root[T] 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 67 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 68 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 69 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 70 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 71 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 72 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 73 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 74 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) Baumsuche(root[T],9) 6 Ausgabe: 9 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 75 Binäre Suchbäume Baumsuche(x,k) 1. if x=nil or k=key[x] then return x 2. if k<key[x] then return Baumsuche(lc[x],k) 3. else return Baumsuche(rc[x],k) 6 7 4 Höhe h 3 SS 2009 Laufzeit: O(h) 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 76 Binäre Suchbäume Weitere Operationen in Binärbäumen • Minimum/Maximumsuche • Nachforlger/Vorgänger Minimum- und Maximumsuche: • Suchbaumeigenschaft: Alle Knoten im rechten Unterbaum eines Knotens x sind größer gleich key[x] • Alle Knoten im linken Unterbaum von x sind ≤ key[x] SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 77 Binäre Suchbäume MinimumSuche(x) 1. while lc[x]≠nil do x ← lc[x] 2. return x 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 78 Binäre Suchbäume MinimumSuche(x) 1. while lc[x]≠nil do x ← lc[x] 2. return x x 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 79 Binäre Suchbäume MinimumSuche(x) 1. while lc[x]≠nil do x ← lc[x] 2. return x 6 x 3 SS 2009 7 4 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 80 Binäre Suchbäume MinimumSuche(x) 1. while lc[x]≠nil do x ← lc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 81 Binäre Suchbäume MinimumSuche(x) 1. while lc[x]≠nil do x ← lc[x] 2. return x Laufzeit O(h) 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 82 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 83 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 84 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 85 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 86 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 87 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x Laufzeit O(h) 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 88 Binäre Suchbäume MaximumSuche(x) 1. while rc[x]≠nil do x ← rc[x] 2. return x Laufzeit O(h) 6 7 4 x 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 89 Binäre Suchbäume Nachfolgersuche: • Nachfolger bzgl. Inorder-Tree-Walk • Wenn alle Schlüssel unterschiedlich, dann ist das der nächstgrößere Schlüssel 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 90 Binäre Suchbäume Nachfolgersuche: • Fall 1 (rechter Unterbaum von x nicht leer): Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 91 Binäre Suchbäume Nachfolgersuche: • Fall 1 (rechter Unterbaum von x nicht leer): Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 92 Binäre Suchbäume Nachfolgersuche: • Fall 1 (rechter Unterbaum von x nicht leer): Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x 6 7 4 3 SS 2009 7 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 93 Binäre Suchbäume Nachfolgersuche: • Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y): Dann ist y der niedrigste Vorgänger von x, dessen linkes Kind ebenfalls Vorgänger von x ist 6 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 94 Binäre Suchbäume Nachfolgersuche: • Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y): Dann ist y der niedrigste Vorgänger von x, dessen linkes Kind ebenfalls Vorgänger von x ist 6 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 95 Binäre Suchbäume Nachfolgersuche: • Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y): Dann ist y der niedrigste Vorgänger von x, dessen linkes Kind ebenfalls Vorgänger von x ist 6 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 96 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 97 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(6) 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 98 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(6) 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 99 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(6) 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 100 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 101 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 102 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) 6 5. y ← p[y] 6. return y y 4 7 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 103 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) 6 5. y ← p[y] 6. return y y 4 7 3 SS 2009 5 x Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 104 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) 6 5. y ← p[y] 6. return y y 4 x 7 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 105 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) y 6 5. y ← p[y] 6. return y 7 4 x 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 106 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) y 6 5. y ← p[y] 6. return y 7 4 x 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 107 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] 3. while y ≠ nil and x=rc[y] do 4. x ← y Nachfolgersuche(5) y 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 108 Binäre Suchbäume Nachfolgersuche(x) 1. if rc[x] ≠ nil then return MinimumSuche(rc[x]) 2. y ← p[x] Laufzeit O(h) 3. while y ≠ nil and x=rc[y] do 4. x ← y 6 5. y ← p[y] 6. return y 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 109 Binäre Suchbäume Vorgängersuche: • Symmetrisch zu Nachfolgersuche • Daher ebenfall O(h) Laufzeit 6 7 4 3 SS 2009 5 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 110 Binäre Suchbäume Binäre Suchbäume: • Aufzähler der Elemente mit Inorder-Tree-Walk in O(n) Zeit • Such in O(h) Zeit • Minimum/Maximum in O(h) Zeit Dynamische Operationen? • Einfügen und Löschen • Müssen Suchbaumeigenschaft aufrecht erhalten • Auswirkung auf Höhe des Baums? SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 111 Binäre Suchbäume Einfügen: • Ähnlich wie Baumsuche: Finde Blatt, an das neuer Knoten angehängt wird • Danach wird nil-Zeiger durch neues 6 Element ersetzt 7 4 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 112 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 113 Binäre Suchbäume Einfügen(T,z) y ist Vater des 1. y← nil; x ← root[T] Einfügen(8) einzufügenden 2. while x≠nil do Elements 3. y ← x x 6 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 7 6. p[z] ← y 4 7. if y=nil then root[T] ← z 8. else 3 5 9 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 114 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) x 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 115 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) x 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen y 5 9 116 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) x 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen y 5 9 117 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 x 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen y 5 9 118 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 x 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen y 5 9 119 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 x 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 120 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 x 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 121 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 x 9 122 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 x 9 123 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 x 9 y 124 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x nil 125 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x nil 126 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x nil 127 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x nil 128 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x 8 129 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Einfügen(8) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 y x 8 130 Binäre Suchbäume Einfügen(T,z) 1. y← nil; x ← root[T] 2. while x≠nil do 3. y ← x 4. if key[z] < key[x] then x ← lc[x] 5. else x ← rc[x] 6. p[z] ← y 7. if y=nil then root[T] ← z 8. else 9. if key[z]< key[y] then lc[y] ← z 10. else rc[y] ← z SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen Einfügen(8) Laufzeit: O(h) 131 Binäre Suchbäume Löschen: • • • • 3 unterschiedliche Fälle (a) zu löschendes Element z hat keine Kinder (b) zu löschendes Element z hat ein Kind (c) zu löschendes Element z hat zwei Kinder SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 132 Binäre Suchbäume Fall (a): • zu löschendes Element z hat keine Kinder 6 7 4 3 5 SS 2009 9 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 133 Binäre Suchbäume Fall (a): • zu löschendes Element z hat keine Kinder • Entferne Element 6 7 4 3 5 SS 2009 6 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 7 9 134 Binäre Suchbäume Fall (b): • zu löschendes Element z hat ein Kind 6 7 4 3 5 SS 2009 9 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 135 Binäre Suchbäume Fall (b): • zu löschendes Element z hat ein Kind • Hänge der Unterbaum von z an den Vater von z 6 7 4 3 5 SS 2009 6 9 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 136 Binäre Suchbäume Fall (c): • zu löschendes Element z hat zwei Kinder 6 7 4 3 5 SS 2009 9 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 137 Binäre Suchbäume Fall (c): • zu löschendes Element z hat zwei Kinder • Schritt 1: Bestimme Nachfolger von z 6 7 4 3 5 SS 2009 9 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 138 Binäre Suchbäume Fall (c): • zu löschendes Element z hat zwei Kinder • Schritt 1: Bestimme Nachfolger von z • Schritt 2: Entferne Nachfolger 6 7 4 3 5 SS 2009 6 9 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 139 Binäre Suchbäume Nachfolger hat nur einKinder Kind! • zu löschendes Element z hat zwei • Schritt 1: Bestimme Nachfolger von z • Schritt 2: Entferne Nachfolger Fall (c): 6 7 4 3 5 SS 2009 6 9 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 140 Binäre Suchbäume Fall (c): • zu löschendes Element z hat zwei Kinder • Schritt 1: Bestimme Nachfolger von z • Schritt 2: Entferne Nachfolger 6 7 4 3 5 SS 2009 6 9 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 141 Binäre Suchbäume Fall (c): • zu löschendes Element z hat zwei Kinder • Schritt 1: Bestimme Nachfolger von z • Schritt 2: Entferne Nachfolger; ersetze durch Nachfolger 6 7 4 3 5 SS 2009 7 9 4 9 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 142 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 143 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Löschen(6) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 144 Binäre Suchbäume Referenz auf z wird übergeben! Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Löschen(6) 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 145 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Bestimme Knoten, der gelöscht werden soll. Der Knoten hat nur einen Nachfolger Löschen(6) z 6 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 146 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Bestimme Knoten, der gelöscht werden soll. Der Knoten hat nur einen Nachfolger Löschen(6) z 6 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 147 Binäre Suchbäume Bestimme den Löschen(T,z) Nachfolger von y 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z)(falls dieser existiert). 3. if lc[y] ≠ nil then x ← lc[y] Löschen(6) 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] z 6 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 4 9. if y ≠ z then key[z] ← key[y] 10. return y 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 7 y 9 x 148 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z Aktualisiere 2. else y ← NachfolgerSuche(z)Vaterzeiger von 3. if lc[y] ≠ nil then x ← lc[y] x Löschen(6) 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] z 6 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 4 9. if y ≠ z then key[z] ← key[y] 10. return y 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 7 y 9 x 149 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Löschen(6) z 6 7 y 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 x 150 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] Das rechte Kind Löschen(6) 4. else x ← rc[y] von z wird x. 5. if x ≠ nil then p[x] ← p[y] z 6 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 4 9. if y ≠ z then key[z] ← key[y] 10. return y 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 7 y 9 x 151 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] Das rechte Kind Löschen(6) 4. else x ← rc[y] von z wird x. 5. if x ≠ nil then p[x] ← p[y] z 6 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 4 9. if y ≠ z then key[z] ← key[y] 10. return y 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 7 y 9 x 152 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] Löschen(6) 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x Umkopieren von 7 7. else if y=lc[p[y]] then lc[p[y]]y← x nach z. 8. else rc[p[y]] ← x 4 9. if y ≠ z then key[z] ← key[y] 10. return y 3 SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 5 9 x 153 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Löschen(6) 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 5 154 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Löschen(6) 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 5 155 Binäre Suchbäume Löschen(T,z) 1. if lc[z]=nil or rc[z]=nil then y ← z 2. else y ← NachfolgerSuche(z) 3. if lc[y] ≠ nil then x ← lc[y] 4. else x ← rc[y] 5. if x ≠ nil then p[x] ← p[y] 6. if p[y]=nil then root[T] ← x 7. else if y=lc[p[y]] then lc[p[y]] ← x 8. else rc[p[y]] ← x 9. if y ≠ z then key[z] ← key[y] 10. return y SS 2009 Laufzeit O(h) Löschen(6) 7 4 3 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 9 5 156 Binäre Suchbäume Binäre Suchbäume: • Ausgabe aller Elemente in O(n) • Suche, Minimum, Maximum, Nachfolger in O(h) • Einfügen, Löschen in O(h) Frage: • Wie kann man eine „kleine“ Höhe unter Einfügen und Löschen garantieren? SS 2009 Datenstrukturen und Algorithmen 11.Elementare Datenstrukturen 157 Balancierte binäre Suchbäume AVL-Bäume • Ein Baum heißt AVL-Baum, wenn für jeden Knoten gilt: Die Höhe seines linken und rechten Teilbaums unterscheidet sich höchstens um 1. SS 2009 Datenstrukturen und Algorithmen 12.Balancierte Binärbäume 158 Balancierte binäre Suchbäume Satz 12.1 Für jeden AVL-Baum der Höhe h mit n Knoten gilt: (3/2)h≤ n ≤ 2h+1-1 SS 2009 Datenstrukturen und Algorithmen 12.Balancierte Binärbäume 159 Balancierte binäre Suchbäume Satz 12.1 Für jeden AVL-Baum der Höhe h mit n Knoten gilt: (3/2)h≤ n ≤ 2h+1-1 Korollar 12.2 Ein AVL-Baum mit n Knoten hat Höhe Θ(log n). SS 2009 Datenstrukturen und Algorithmen 12.Balancierte Binärbäume 160 Balancierte binäre Suchbäume Rotationen: y x x C A SS 2009 y Rechtsrotation(T,y) Linksrotation(T,x) A B B Datenstrukturen und Algorithmen 12.Balancierte Binärbäume C 161 Balancierte binäre Suchbäume Beispiel 1: 15 Rechtsrotation(T,y) y 21 9 9 7 x 17 SS 2009 15 27 19 7 19 x 21 y 17 27 20 20 Datenstrukturen und Algorithmen 12.Balancierte Binärbäume 162 Balancierte binäre Suchbäume Beispiel 2: 15 x 21 9 17 Linksrotation(T,x) x y 27 19 7 SS 2009 21 20 Datenstrukturen und Algorithmen 12.Balancierte Binärbäume 27 15 9 7 y 19 17 20 163