Binärbäume Klaus Becker 2003 Datenstrukturierung mit Bäumen 2 Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Binärbäume 3 KB Teil 1 Termbäume Termbaum 4 Ein Termbaum dient dazu, einen Rechenterm wie z. B. (x+3)*(2x-5) strukturell zu repräsentieren. Binärbäume * + x – 3 * 2 5 x Ziel: Entwicklung eines Programms zur Verarbeitung von Term(bäum)en. KB Binärbaum 5 Wurzel * Binärbäume + x linker Teilbaum – 3 * 2 5 x rechter Teilbaum Ein Binärbaum ist leer oder besteht aus einer Wurzel und zwei Binärbäumen, dem linken und rechten Teilbaum. KB Objektorientierte Modellierung 6 inhalt = * links rechts Binärbäume inhalt = + links inhalt = x links rechts inhalt = – rechts links inhalt = 3 links inhalt = * rechts links inhalt = 2 links KB rechts rechts rechts inhalt = 5 links inhalt = x links rechts rechts 7 Objektorientierte Modellierung * Binärbäume + KB x – 3 * 5 8 OOA-Modell Baum wurzel: Knoten ... 0..1 kennt Knoten inhalt: ... links: Knoten rechts: Knoten Binärbäume ... KB 0..2 kennt OOD-Modell 9 Baum Binärbäume - wurzel: Knoten kennt + create(w: Knoten) + getWurzel: Knoten + istLeer: boolean + ausgebenInOrder(k: Knoten): string + ausgebenPreOrder(k: Knoten): string + ausgebenPostOrder(k: Knoten): string ist TermBaum + auswerten(k: Knoten; w: integer): integer KB 0..1 Knoten - inhalt: string - links: Knoten - rechts: Knoten + create(i: string; l,r: Knoten) + getInhalt: string + getLinks: Knoten + getRechts: Knoten 0..2 kennt 10 Implementierung Binärbäume constructor TKnoten.create(inhalt: string; links, rechts: TKnoten); begin self.inhalt := inhalt; self.links := links; self.rechts := rechts end; KB function TKnoten.getInhalt: string; begin result := inhalt; end; function TKnoten.getLinks: TKnoten; begin result := links; end; function TKnoten.getRechts: TKnoten; begin result := rechts; end; 11 Implementierung Binärbäume constructor TBaum.create(w: TKnoten); begin wurzel := w; end; KB function TBaum.istLeer: boolean; begin result := (wurzel = nil); end; function TBaum.getWurzel: TKnoten; begin result := wurzel; end; procedure TBaum.setWurzel(k: TKnoten); begin wurzel := k; end; 12 Erzeugung des Termbaums Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll mit Hilfe der bisher implementierten Baumoperationen erzeugt werden. Binärbäume * + x – 3 * 2 KB 5 x Binärbäume 13 Erzeugung des Termbaums – Version 1 k1 := TKnoten.create('2', nil, nil); k2 := TKnoten.create('x', nil, nil); k3 := TKnoten.create('*', k1, k2); k4 := TKnoten.create('5', nil, nil); k5 := TKnoten.create('-', k3, k4); k6 := TKnoten.create('x', nil, nil); k7 := TKnoten.create('3', nil, nil); k8 := TKnoten.create('+', k6, k7); k9 := TKnoten.create('*', k8, k5); baum := TTermBaum.create(k9); * + x KB – 3 * 2 5 x Erzeugung des Termbaums – Version 2 14 Binärbäume baum := TTermBaum.create( TKnoten.create('*', TKnoten.create('+', TKnoten.create('x', nil, nil), TKnoten.create('3', nil, nil)), TKnoten.create('-', TKnoten.create('*', TKnoten.create('2', nil, nil), TKnoten.create('x', nil, nil)), * TKnoten.create('5', nil, nil)))); + x KB – 3 * 2 5 x 15 Traversierung eines Binärbaums Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll nach einer vorgegeben Regel durchlaufen und verarbeitet (z. B. ausgegeben) werden. Binärbäume * + x – 3 * 2 KB 5 x 16 Preorder-Traversierung eines Binärbaums * Binärbäume + x – 3 * 2 5 x Verarbeite die Wurzel Traversiere den linken Teilbaum in „Preorder“ Traversiere den rechten Teilbaum in „Preorder“ *+x3-*2x5 KB 17 Inorder-Traversierung eines Binärbaums * Binärbäume + x – 3 * 2 5 x Traversiere den linken Teilbaum in „Inorder“ Verarbeite die Wurzel Traversiere den rechten Teilbaum in „Inorder“ x+3*2*x-5 KB 18 Postorder-Traversierung eines Binärbaums * Binärbäume + x – 3 * 2 5 x Traversiere den linken Teilbaum in „Postorder“ Traversiere den rechten Teilbaum in „Postorder“ Verarbeite die Wurzel x3+2x*5-* KB Preorder-Ausgabe 19 Deklaration: Binärbäume function TBaum.ausgebenPreOrder(k:TKnoten):String; begin if (k = nil) then result := '' else result := k.getInhalt + ausgebenPreOrder(k.getLinks) + ausgebenPreOrder(k.getRechts); end; Aufruf: baum.ausgebenPreOrder(baum.getWurzel) KB Aufgabe 20 Im Ordner „Termbaum1“ finden Sie ein vorstrukturiertes Programm zur Erzeugung und Verarbeitung von Binärbäumen / Termbäumen. Binärbäume Ergänzen Sie die fehlenden Teile (Erzeugung eines Binärbaums und Ausgabe in Preorder, Inorder, Postorder). KB Zur Kontrolle: Termbaum2 21 Auswertung eines Termbaums Aufgabe: Ein Termbaum (wie der hier dargestellte) soll bzgl. eines vorgegeben x-Wertes ausgewertet werden: x-Wert einsetzen und Gesamtwert berechnen Binärbäume * + x – 3 * 2 KB 5 x x = 3: Auswertung liefert 6 22 Rekursive Problemreduktion baum.auswerten(k,w) if k.getInhalt = '*' then result := Binärbäume * + x – 3 * 2 baum.auswerten(k.links,w) KB * 5 x baum.auswerten(k.rechts,w) Rekursionsanfang 23 baum.auswerten(k,w) Binärbäume if ((k.getRechts = nil) and (k.getLinks = nil)) then KB x 3 if k.getInhalt = 'x' then else result := w result := StrToInt(k.getInhalt); Aufgabe 24 Implementieren Sie die Operation „auswerten“ und ergänzen Sie das Testprogramm. Binärbäume Zur Kontrolle: Termbaum2 KB Binärbäume 25 KB Teil 2 Suchbäume Textindex Binärbäume 26 KB Die #Geschichte# des Kölner Zoos #Gründung# des Zoo und die ersten Jahre Affeninsel; 33 Auf Betreiben von Dr. Caspar #Garthe#, dem ersten Oberlehrer an der Höheren Bürgerschule am Quatermarkt zu Köln, schlossen sich wohlhabende und einflußreiche, zugleich tierliebende und zoobegeisterte Bürger der Stadt zu einer Aktiengesellschaft zusammen, um 1860 in Köln einen #Zoologischen Garten# zu gründen. In kaum einem anderen Zoo läßt sich die #Entwicklung# der Zoologischen Gärten anhand noch erhaltener #Tierhäuser und -anlagen# aus den verschiedenen #Epochen# so gut nachvollziehen wie im Kölner Zoo. Das älteste Monument ist das 1863 unter Leitung von Dr. Heinrich #Bodinus# (1859-1869) erbaute #Elefantenhaus# in #maurischem Stil#. Bodinus; 16 ... Hagenbeck; 28 ... Blockhaus-Stil; 20 Elefantenhaus; 79 Elefantenhaus; 17 Entwicklung; 11 Epochen; 14 Funck; 19 Garthe; 4 Geschichte; 1 Gründung; 2 Ziel: Es soll ein Programm entwickelt werden, mit dessen Hilfe ein Textindex erstellt und zum „Nachschlagen“ benutzt werden kann. Im vorliegenden Fall soll der Textindex die Zeilennummern der markierten Begriffe enthalten. Binärbäume 27 KB Prototyp Zur Wahl der Datenstruktur 28 Affe; 24 Esel; 9 Esel; 4 Giraffe; 6 Gorilla; 23 Jaguar; 8 Liste Lineare Suche Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Binärbaum Binäre Suche Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchbaum 29 Löwe; 12 Binärbäume Esel; 4 Pfau; 27 Esel; 9 Affe; 24 Jaguar; 8 Giraffe; 6 Kamel; 45 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Gorilla; 23 alle Wurzel KB alle > Wurzel Suchbaum 30 Löwe; 12 Binärbäume Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 alle Wurzel KB alle > Wurzel Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Problemspezifikation 31 Ausgangszustand: Fasan; 13 Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Zielzustand: KB Pfau; 27 Jaguar; 8 Giraffe; 6 Fasan; 13 Kamel; 45 Gorilla; 23 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 32 Binärbäume Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum nicht leer neu: Löwe; 12 aktuell: Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Fasan; 13 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 33 Binärbäume Problemreduktion: Einfügen im linken Teilbaum neu: Löwe; 12 aktuell: Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Fasan; 13 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 34 Binärbäume Situation: aktueller Wurzelknoten existiert neuer Begriff > aktueller Begriff rechter Teilbaum nicht leer aktuell: Esel; 9 Affe; 24 neu: Löwe; 12 Esel; 4 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Fasan; 13 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 35 Problemreduktion: Einfügen im rechten Teilbaum Fasan; 13 neu: Binärbäume Löwe; 12 aktuell: Esel; 9 Affe; 24 Esel; 4 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 36 Binärbäume Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum nicht leer Esel; 9 aktuell: neu: Löwe; 12 Esel; 4 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Fasan; 13 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 37 Problemreduktion: Einfügen im linken Teilbaum Fasan; 13 neu: Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 aktuell: Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 38 Binärbäume Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum ist leer Esel; 9 Pfau; 27 Jaguar; 8 aktuell: neu: Löwe; 12 Esel; 4 Affe; 24 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Fasan; 13 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Einfügen: Lösungsstrategie 39 Problemlösung: linker Nachfolger neuer Knoten mit neuem Begriff Fasan; 13 neu: Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Jaguar; 8 aktuell: Giraffe; 6 Fasan; 13 KB Pfau; 27 Kamel; 45 Gorilla; 23 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 40 Einfügen: Lösungsstrategie Sonderfall: aktueller Wurzelknoten existiert nicht neu: Fasan; 13 Binärbäume aktuell: KB Problemlösung: Wurzel neuer Knoten mit neuem Begriff neu: Fasan; 13 aktuell: Fasan; 13 Einfügen: Algorithmus 41 Einfügen eines neuen Begriffs in einen Baum existiert aktueller Wurzelknoten ? Binärbäume ja neuer Begriff <= aktueller Begriff ? ja ja hat aktuelle Wurzel linken Nachfolger ? Einfügen im linken Teilbaum KB nein linker Nachfolger := neuer Knoten mit neuem Begriff ja nein nein hat aktuelle Wurzel rechten Nachfolger ? Einfügen im rechten Teilbaum nein rechter Nachfolger := neuer Knoten mit neuem Begriff Wurzel := neuer Knoten mit neuem Begriff Suchen: Problemspezifikation 42 Ausgangszustand: Zielzustand: Esel Suchergebnis: Binärbäume Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB : Suchbegriff Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Problemspezifikation 43 Ausgangszustand: Esel Suchergebnis: Binärbäume Idee: Preorder-Durchlauf mit Aufsammeln aller Treffer Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Esel; 4 Esel; 9 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB : Suchbegriff Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 44 Situation: Esel : Suchbegriff Suchergebnis: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB : aktuell Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 45 Problemreduktion: Esel Binärbäume if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Affe; 24 Löwe; 12 : aktuell Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Suchergebnis: Esel; 4 Esel; 9 : Suchbegriff Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 46 Situation: Esel : Suchbegriff Suchergebnis: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 : aktuell Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Pfau; 27 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 47 Problemreduktion: Esel Binärbäume if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Esel; 4 Esel; 9 Affe; 24 Esel; 4 Löwe; 12 Jaguar; 8 Kamel; 45 Gorilla; 23 KB Suchergebnis: : aktuell Giraffe; 6 : Suchbegriff Pfau; 27 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 48 Situation: Esel : Suchbegriff Suchergebnis: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Esel; 4 Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 : aktuell Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 49 Problemreduktion: Esel Binärbäume if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Affe; 24 Löwe; 12 : aktuell Esel; 4 Esel; 9 Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Suchergebnis: Esel; 4 Esel; 9 : Suchbegriff Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 50 Situation: Esel : Suchbegriff Suchergebnis: aktueller Wurzelknoten existiert Suchbegriff > aktueller Begriff Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 : aktuell Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Esel; 4 Esel; 9 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 51 Problemreduktion: Esel : Suchbegriff Suchergebnis: rechten Teilbaum durchsuchen Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 : aktuell Pfau; 27 Jaguar; 8 Giraffe; 6 Kamel; 45 Gorilla; 23 KB Esel; 4 Esel; 9 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 52 Situation: Esel : Suchbegriff Suchergebnis: aktueller Wurzelknoten existiert nicht Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 KB Pfau; 27 Jaguar; 8 Giraffe; 6 : aktuell Esel; 4 Esel; 9 Kamel; 45 Gorilla; 23 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Lösungsstrategie 53 Problemlösung: Esel : Suchbegriff Suchergebnis: Mache nichts Binärbäume Löwe; 12 Esel; 4 Esel; 9 Affe; 24 KB Pfau; 27 Jaguar; 8 Giraffe; 6 : aktuell Esel; 4 Esel; 9 Kamel; 45 Gorilla; 23 Panther; 4 Wolf; 31 Tiger; 6 Zebra; 10 Suchen: Algorithmus 54 Suchen eines Begriffs in einem Baum existiert aktueller Wurzelknoten ? Binärbäume ja neuer Begriff <= aktueller Begriff ? ja ja neuer Begriff = aktueller Begriff ? Begriff und Daten aufnehmen linken Teilbaum durchsuchen KB nein nein rechten Teilbaum durchsuchen nein 55 Objektorientierte Modellierung Löwe; 12 Binärbäume Esel; 4 Esel; 9 Pfau; 27 Jaguar; 8 Baum - wurzel: Knoten + create(w: Knoten) + getWurzel: Knoten + istLeer: boolean + initialisieren + einfuegen(b: string; z: integer; aktuell: TKnoten) + suchen(b: string; k: TKnoten; var s: TStringList) + ausgeben(k: TKnoten; var s: TStringList) KB Panther; 4 0..1 kennt Wolf; 31 Knoten - begriff: string - zeile: integer - links: Knoten - rechts: Knoten + create(b: string; z: int.; l,r: Knoten) + getBegriff: string + getZeile: integer + getLinks: Knoten + getRechts: Knoten 0..2 kennt Aufgabe 56 Im Ordner „Suchbaum1“ finden Sie ein vorstrukturiertes Programm zur Erzeugung und Verarbeitung von Suchbäumen. Binärbäume Implementieren Sie die Operation „einfuegen“, „suchen“ und „ausgeben“. KB Zur Kontrolle: Suchbaum2 Binärbäume 57 KB Teil 3 Zusammenfassung: Dynamische Datenstrukturen 58 Datenstrukturierung Binärbäume * + x – 3 * 2 5 x Ein Grundproblem der Programmierung: Daten möglichst strukturgetreu zu repräsentieren KB 59 Datentypen / Datenstrukturen Binärbäume Ein Datentyp legt einen Wertebereich und die Grundoperationen, die auf die Elemente des Wertebereichs angewandt werden können, fest. Beispiele (für elementare Datentypen): > boolean (Wahrheitswert) > char (Zeichen) > integer (ganze Zahl) > real (Dezimalzahl) Eine Datenstruktur legt den Aufbau von komplexen Wertebereichen aus einfacheren Wertebereichen fest. Beispiele (für elementare Datenstrukturen): > Reihung / Feld > Verbund KB Dynamische Datenstrukturen Binärbäume 60 Dynamische Datenstrukturen werden benutzt, wenn sich die Struktur der Dateneinheiten zur Laufzeit dynamisch verändern kann. KB 61 Erzeugung dynamischer Datenstrukturen Binärbäume Erzeugung mit Hilfe von Referenzattributen (Pointer) Erzeugung mit Hilfe vordefinierter KLassen KB TList; TStringList; TStack; ... Literaturhinweise 62 Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak. Verlag 1999. Binärbäume H.-P. Gumm u. M. Sommer: Einführung in die Informatik. Oldenbourg Verlag 2002. KB ...