640 likes | 930 Views
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. *. +. –. x. 3. *. 5. 2. x. Termbaum.
E N D
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
* + – x 3 * 5 2 x Termbaum Ein Termbaum dient dazu, einen Rechenterm wie z. B. (x+3)*(2x-5) strukturell zu repräsentieren. 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 Baum Knoten wurzel: Knoten inhalt: ... links: Knoten rechts: Knoten kennt kennt ... ...
OOD-Modell 0..2 0..1 Baum Knoten kennt - 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);beginself.inhalt := inhalt; self.links := links; self.rechts := rechtsend; function TKnoten.getInhalt: string;beginresult := inhalt;end; function TKnoten.getLinks: TKnoten;beginresult := links;end; function TKnoten.getRechts: TKnoten;beginresult := rechts;end;
Implementierung constructor TBaum.create(w: TKnoten);beginwurzel := w;end; function TBaum.istLeer: boolean;beginresult := (wurzel = nil);end; function TBaum.getWurzel: TKnoten;beginresult := wurzel;end; procedure TBaum.setWurzel(k: TKnoten);beginwurzel := k;end;
* + – x 3 * 5 2 x Erzeugung des Termbaums Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll mit Hilfe der bisher implementierten Baumoperationen erzeugt werden.
* + – x 3 * 5 2 x 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 * 5 2 x 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))));
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 WurzelTraversiere 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 WurzelTraversiere 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; beginif (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
* + – x 3 * 5 2 x 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: 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 else result := StrToInt(k.getInhalt); if k.getInhalt = 'x' then result := w
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 JahreAuf 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.
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 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 alle Wurzel alle > Wurzel
Suchbaum 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 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 existiertneuer Begriff aktueller Begrifflinker 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 existiertneuer Begriff > aktueller Begriffrechter 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 existiertneuer Begriff aktueller Begrifflinker 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 existiertneuer Begriff aktueller Begrifflinker 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 Fasan; 13 neu: aktuell: Fasan; 13 neu: Problemlösung: Wurzel neuer Knoten mit neuem Begriff aktuell: Fasan; 13
Suchen: Problemspezifikation Ausgangszustand: Esel : Suchbegriff Zielzustand: Suchergebnis: Esel; 4Esel; 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; 4Esel; 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 existiertSuchbegriff 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 aufnehmenlinken 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 existiertSuchbegriff 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 aufnehmenlinken Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Esel; 4 Löwe; 12 Esel; 4 Pfau; 27 : aktuell 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 existiertSuchbegriff 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 aufnehmenlinken Teilbaum durchsuchen Esel : Suchbegriff Suchergebnis: Esel; 4Esel; 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 existiertSuchbegriff > aktueller Begriff Esel : Suchbegriff Suchergebnis: Esel; 4Esel; 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