Was bisher geschah rekursive Datenstrukturen: I lineare Datenstrukturen: I I I I verkettete Liste Stack Queue hierarchische Datenstrukturen: Bäume I I I allgemeine Bäume Binäre Bäume Unäre Bäume = Listen 110 ADT Binärbaum mit Knotenmarkierungen vom Typ Element I Sorten: Bool, El, BTree I Signatur: ⊥: isEmpty : BTree → Node : El × BTree × BTree → Left, Right : BTree → Val : BTree → t, f : I BTree Bool BTree BTree El Bool Axiome: ∀v ∈ El ∀t1 ∈ BTree ∀t2 ∈ BTree isEmpty(⊥) : = t isEmpty(Node(v , t1 , t2 )) : = f Left(Node(v , t1 , t2 )) : = t1 Right(Node(v , t1 , t2 )) : = t2 Val(Node(v , t1 , t2 )) : = v 111 Binäre Suchbäume Binärer Baum t hat die Suchbaum-Eigenschaft gdw. für jeden Teilbaum t 0 = node(v , l, r ) von t gilt: I für jeden Schlüsselwert v 0 eines inneren Knotens von l gilt v0 ≤ v I für jeden Schlüsselwert v 0 eines inneren Knotens von r gilt v ≤ v0 Ergebnis der Inorder-Durchquerung jedes binären Suchbaumes ist eine aufsteigend sortierte Folge Sortierte Ausgabe aller im Suchbaum mit n Knoten enthaltenen Daten in O(n) 112 Suche in binären Suchbäumen Spezifikation: gegeben: binärer Suchbaum t (Wurzel) Schlüsselwert x gesucht: Knoten t 0 in t mit Val(t 0 ) = x, ⊥, falls t keinen Knoten mit dem Schlüsselwert x enthält find(t,x): if isEmpty(t) or if x = Val(t) return x else if x < Val(t) return find(Left(t), x) else return find(Right(t), x) 113 Laufzeit der Suche Laufzeit von find(t,x) abhängig von Anzahl n der Knoten in t: I falls t einen Knoten t 0 mit Val(t 0 ) = x enthält: Tiefe des Knotens t 0 I falls t keine Knoten t 0 mit Val(t 0 ) = x enthält: Tiefe des Baumes t 0 höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n) Suche im Suchbaum t in O(hoehe(t)) (i.A. schneller als lineare Suche in einer Folge) 114 Anwendung von Suchbäumen Binäre Suchbäume sind geeignet zum Speichern und schnellen Wiederfinden von Daten anhand ihnen zugeordneten Schlüsselwerten Binäre Suchbäume: I Implementierung des ADT Menge für linear geordnete Mengen I Implementierung von Wörterbüchern: Daten mit zugeordnetem Schlüsselwert (aus einer linear geordneten Menge) Operationen: find, insert, remove z.B. Telefonbucheinträge über Namen (alphabetisch geordnet), Studenten über Studentennummern 115 Extremwerte in binären Suchbäumen Spezifikation: gegeben: binärer Suchbaum t (Wurzel) gesucht: Knoten in t mit dem minimalen Schlüsselwert, d.h. Knoten s, wobei für jeden Knoten r gilt Val(s) ≤ Val(r) ⊥, falls t = ⊥ Minimaler Schlüsselwert binären Suchbaum steht im äußeren linken Knoten minimum(t): if isEmpty(t) return Nil else if Left(t) = Nil return t else return minimum(Left(t)) Minimum lässt sich ohne Schlüsselvergleich bestimmen. Laufzeit höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n) Minimum-Suche im Suchbaum mit n Knoten in O(hoehe(t)) Maximum analog 116 Einfügen in binäre Suchbäume Spezifikation: gegeben: binärer Suchbaum t mit den Schlüsseln {x1 , . . . , xn } Schlüsselwert x gesucht: binärer Suchbaum t 0 mit den Schlüsseln {x1 , . . . , xn , x} insert(t,x): if isEmpty(t) return Node(x,Nil,Nil) else if x < Val(t) return insert (Left(t),x) else return insert (Right(t),x) 117 Iteriertes Einfügen Beim Einfügen der Elemente der Menge {2, 3, 5, 7} in verschiedenen Reihenfolgen entstehen i.A. veschiedene Bäume Beispiel (Tafel): I 3,7,5,2 I 5,3,7,2 I 2,3,5,7 Sortieren durch Einfügen in binären Suchbaum 1. schrittweises Einfügen aller Elemente einer Menge in einen zu Beginn leeren binären Suchbaum 2. Sortierte Ausgabe durch Inorder-Durchquerung des so entstandenen binären Suchbaumes 118 Laufzeit Einfügen Idee: neues Blatt mit Schlüsselwert x wird dort eingefügt, wo es der Suchalgorithmus finden würde selbe Laufzeit wie Suche: höchstens Höhe des Baumes t (log n ≤ hoehe(t) ≤ n) Einfügen in einen binären Suchbaum mit n Knoten in O(hoehe(t)) 119 Löschen aus binären Suchbäumen Spezifikation: gegeben: binärer Suchbaum t mit den Schlüsseln {x1 , . . . , xn } Schlüsselwert x gesucht: binärer Suchbaum t 0 mit den Schlüsseln {x1 , . . . , xn } \ {x} Idee: Fälle 1. x kommt nicht in t vor: Ergebnis t 0 = t 2. x ist Schlüsselwert eines Knotens s in t mit zwei leeren Kindern: Löschen des Knotens s (Ersetzen durch ⊥) 3. x ist Schlüsselwert eines Knotens s in t mit einem leeren Kind: Ersetzen des Knotens s durch sein einziges nichtleeres Kind 4. x ist Schlüsselwert eines Knotens s in t ohne leeres Kind: Tausch der Schlüsselwerte in s und dem linken äußeren Knoten r des rechten Kindes von s Löschen des Knotens r Warum hat der so entstandene Baum die Suchbaumeigenschaft? Löschen eines Knotens aus einem binären Suchbaum t in O(hoehe(t)) 120 Laufzeiten I find I insert I remove in O(hoehe(t)) Laufzeiten in Abhängigkeit von der Knotenzahl n = size(t): Extremfälle: I für Pfade (entartete Bäume) hoehe(t) = size(t) Laufzeit der Operationen O(n) I für balancierte Bäume hoehe(t) = log size(t) Laufzeit der Operationen O(log n) 121