Binärbäume Klaus Becker 2003
Datenstrukturierung mit Bäumen Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Teil 1 Termbäume
Termbaum Ein Termbaum dient dazu, einen Rechenterm wie z. B. (x+3)*(2x-5) strukturell zu repräsentieren. * + x 3 2 – 5 Ziel: Entwicklung eines Programms zur Verarbeitung von Term(bäum)en.
Binärbaum Wurzel * + – x 3 * 5 linker Teilbaum 2 x rechter Teilbaum Ein Binärbaum ist leer oder besteht aus einer Wurzel und zwei Binärbäumen, dem linken und rechten Teilbaum.
Objektorientierte Modellierung inhalt = * links rechts inhalt = + inhalt = – links rechts links rechts inhalt = x inhalt = 3 inhalt = * inhalt = 5 links rechts links rechts links rechts links rechts inhalt = 2 inhalt = x links rechts links rechts
Objektorientierte Modellierung * + – x 3 * 5
OOA-Modell 0..1 0..2 kennt kennt Baum Knoten wurzel: Knoten inhalt: ... links: Knoten rechts: Knoten kennt ... ...
OOD-Modell 0..2 0..1 kennt kennt ist Baum Knoten - wurzel: Knoten - inhalt: string - links: Knoten - rechts: Knoten kennt + create(w: Knoten) + getWurzel: Knoten + istLeer: boolean + ausgebenInOrder(k: Knoten): string + ausgebenPreOrder(k: Knoten): string + ausgebenPostOrder(k: Knoten): string + create(i: string; l,r: Knoten) + getInhalt: string + getLinks: Knoten + getRechts: Knoten ist TermBaum + auswerten(k: Knoten; w: integer): integer
Implementierung constructor TKnoten.create(inhalt: string; links, rechts: TKnoten); begin self.inhalt := inhalt; self.links := links; self.rechts := rechts end; function TKnoten.getInhalt: string; begin result := inhalt; end; function TKnoten.getLinks: TKnoten; begin result := links; end; function TKnoten.getRechts: TKnoten; begin result := rechts; end;
Implementierung constructor TBaum.create(w: TKnoten); begin wurzel := w; end; 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;
Erzeugung des Termbaums Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll mit Hilfe der bisher implementierten Baumoperationen erzeugt werden. * + x 3 2 – 5
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 3 2 – 5
Erzeugung des Termbaums – Version 2 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 3 2 – 5
Traversierung eines Binärbaums Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll nach einer vorgegeben Regel durchlaufen und verarbeitet (z. B. ausgegeben) werden. * + – x 3 * 5 2 x
Preorder-Traversierung eines Binärbaums * + – x 3 * 5 2 x Verarbeite die Wurzel Traversiere den linken Teilbaum in „Preorder“ Traversiere den rechten Teilbaum in „Preorder“ * + x 3 - * 2 x 5
Inorder-Traversierung eines Binärbaums * + – x 3 * 5 2 x Traversiere den linken Teilbaum in „Inorder“ Verarbeite die Wurzel Traversiere den rechten Teilbaum in „Inorder“ x + 3 * 2 * x - 5
Postorder-Traversierung eines Binärbaums * + – x 3 * 5 2 x Traversiere den linken Teilbaum in „Postorder“ Traversiere den rechten Teilbaum in „Postorder“ Verarbeite die Wurzel x 3 + 2 x * 5 - *
Preorder-Ausgabe Deklaration: 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)
Aufgabe Im Ordner „Termbaum1“ finden Sie ein vorstrukturiertes Programm zur Erzeugung und Verarbeitung von Binärbäumen / Termbäumen. Ergänzen Sie die fehlenden Teile (Erzeugung eines Binärbaums und Ausgabe in Preorder, Inorder, Postorder). Zur Kontrolle: Termbaum2
Auswertung eines Termbaums Aufgabe: Ein Termbaum (wie der hier dargestellte) soll bzgl. eines vorgegeben x-Wertes ausgewertet werden: x-Wert einsetzen und Gesamtwert berechnen * + x 3 2 – 5 x = 3: Auswertung liefert 6
Rekursive Problemreduktion baum.auswerten(k,w) if k.getInhalt = '*' then result := * + – x 3 * 5 2 x baum.auswerten(k.links,w) baum.auswerten(k.rechts,w) *
Rekursionsanfang baum.auswerten(k,w) if ((k.getRechts = nil) and (k.getLinks = nil)) then x 3 if k.getInhalt = 'x' then result := w else result := StrToInt(k.getInhalt);
Aufgabe Implementieren Sie die Operation „auswerten“ und ergänzen Sie das Testprogramm. Zur Kontrolle: Termbaum2
Teil 2 Suchbäume
Textindex Die #Geschichte# des Kölner Zoos #Gründung# des Zoo und die ersten Jahre 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#. ... Affeninsel; 33 Blockhaus-Stil; 20 Bodinus; 16 Elefantenhaus; 79 Elefantenhaus; 17 Entwicklung; 11 Epochen; 14 Funck; 19 Garthe; 4 Geschichte; 1 Gründung; 2 Hagenbeck; 28 ... 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 Zeilen-nummern der markierten Begriffe enthalten.
Prototyp
Zur Wahl der Datenstruktur Affe; 24 Esel; 9 Esel; 4 Giraffe; 6 Gorilla; 23 Jaguar; 8 Liste Lineare Suche Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23 Binärbaum Binäre Suche
Suchbaum alle Wurzel alle > Wurzel Löwe; 12 Esel; 4 Pfau; 27 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23 alle Wurzel alle > Wurzel
Suchbaum alle Wurzel alle > Wurzel Löwe; 12 Esel; 4 Pfau; 27 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23 alle Wurzel alle > Wurzel
Einfügen: Problemspezifikation Ausgangszustand: Fasan; 13 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Zielzustand: Fasan; 13 Gorilla; 23
Einfügen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum nicht leer Fasan; 13 neu: Löwe; 12 aktuell: Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Problemreduktion: Einfügen im linken Teilbaum Fasan; 13 neu: Löwe; 12 aktuell: Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert neuer Begriff > aktueller Begriff rechter Teilbaum nicht leer Fasan; 13 neu: Löwe; 12 aktuell: Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Problemreduktion: Einfügen im rechten Teilbaum Fasan; 13 neu: Löwe; 12 aktuell: Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum nicht leer Fasan; 13 neu: Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 aktuell: Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Problemreduktion: Einfügen im linken Teilbaum Fasan; 13 neu: Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 aktuell: Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert neuer Begriff aktueller Begriff linker Teilbaum ist leer Fasan; 13 neu: Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 aktuell: Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Einfügen: Lösungsstrategie Problemlösung: linker Nachfolger neuer Knoten mit neuem Begriff Fasan; 13 neu: Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 aktuell: Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Fasan; 13 Gorilla; 23
Einfügen: Lösungsstrategie Sonderfall: aktueller Wurzelknoten existiert nicht neu: Fasan; 13 aktuell: Problemlösung: Wurzel neuer Knoten mit neuem Begriff neu: Fasan; 13 aktuell: Fasan; 13
Einfügen: Algorithmus
Suchen: Problemspezifikation Ausgangszustand: Esel : Suchbegriff Zielzustand: Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Problemspezifikation Ausgangszustand: Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Idee: Preorder-Durchlauf mit Aufsammeln aller Treffer Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Esel : Suchbegriff Suchergebnis: Löwe; 12 : aktuell Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Problemreduktion: if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Löwe; 12 : aktuell Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Esel : Suchbegriff Suchergebnis: Löwe; 12 Esel; 4 : aktuell Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Problemreduktion: if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Esel; 4 Löwe; 12 Esel; 4 : aktuell Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert Suchbegriff aktueller Begriff Esel : Suchbegriff Suchergebnis: Esel; 4 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 : aktuell Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Problemreduktion: if Suchbegriff = aktueller Begriff then Daten aufnehmen linken Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 : aktuell Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert Suchbegriff > aktueller Begriff Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 : aktuell Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Problemreduktion: rechten Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 : aktuell Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 Gorilla; 23
Suchen: Lösungsstrategie Situation: aktueller Wurzelknoten existiert nicht Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 : aktuell Gorilla; 23
Suchen: Lösungsstrategie Problemlösung: Mache nichts Esel : Suchbegriff Suchergebnis: Esel; 4 Esel; 9 Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 Affe; 24 Giraffe; 6 Kamel; 45 Tiger; 6 Zebra; 10 : aktuell Gorilla; 23
Suchen: Algorithmus
Objektorientierte Modellierung Löwe; 12 Esel; 4 Pfau; 27 Esel; 9 Jaguar; 8 Panther; 4 Wolf; 31 0..1 0..2 Baum Knoten - wurzel: Knoten kennt - begriff: string - zeile: integer - links: Knoten - rechts: Knoten kennt + 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) + create(b: string; z: int.; l,r: Knoten) + getBegriff: string + getZeile: integer + getLinks: Knoten + getRechts: Knoten
Aufgabe Im Ordner „Suchbaum1“ finden Sie ein vorstrukturiertes Programm zur Erzeugung und Verarbeitung von Suchbäumen. Implementieren Sie die Operation „einfuegen“, „suchen“ und „ausgeben“. Zur Kontrolle: Suchbaum2
Zusammenfassung: Dynamische Datenstrukturen Teil 3 Zusammenfassung: Dynamische Datenstrukturen
Datenstrukturierung * + x 3 2 – 5 Ein Grundproblem der Programmierung: Daten möglichst strukturgetreu zu repräsentieren
Datentypen / Datenstrukturen 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
Dynamische Datenstrukturen Dynamische Datenstrukturen werden benutzt, wenn sich die Struktur der Dateneinheiten zur Laufzeit dynamisch verändern kann.
Erzeugung dynamischer Datenstrukturen Erzeugung mit Hilfe von Referenzattributen (Pointer) Erzeugung mit Hilfe vordefinierter KLassen TList; TStringList; TStack; ...
Literaturhinweise Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak. Verlag 1999. H.-P. Gumm u. M. Sommer: Einführung in die Informatik. Oldenbourg Verlag 2002. ...