Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
1
Binärbäume Klaus Becker 2003
2
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
3
Teil 1 Termbäume
4
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.
5
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.
6
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
7
Objektorientierte Modellierung
* + – x 3 * 5
8
OOA-Modell 0..1 0..2 kennt kennt Baum Knoten wurzel: Knoten
inhalt: ... links: Knoten rechts: Knoten kennt ... ...
9
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
10
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;
11
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;
12
Erzeugung des Termbaums
Aufgabe: Ein Binärbaum (wie der hier dargestellte) soll mit Hilfe der bisher implementierten Baumoperationen erzeugt werden. * + x 3 2 – 5
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 3 2 – 5
14
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
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. * + – x 3 * 5 2 x
16
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
17
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
18
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 x * 5 - *
19
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)
20
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
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 * + x 3 2 – 5 x = 3: Auswertung liefert 6
22
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) *
23
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);
24
Aufgabe Implementieren Sie die Operation „auswerten“ und ergänzen Sie das Testprogramm. Zur Kontrolle: Termbaum2
25
Teil 2 Suchbäume
26
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# ( ) 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; 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.
27
Prototyp
28
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
29
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
30
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
31
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
32
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
33
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
34
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
35
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
36
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
37
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
38
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
39
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
40
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
41
Einfügen: Algorithmus
42
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
43
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
44
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
45
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
46
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
47
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
48
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
49
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
50
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
51
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
52
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
53
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
54
Suchen: Algorithmus
55
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
56
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
57
Zusammenfassung: Dynamische Datenstrukturen
Teil 3 Zusammenfassung: Dynamische Datenstrukturen
58
Datenstrukturierung * + x 3 2 – 5 Ein Grundproblem der Programmierung: Daten möglichst strukturgetreu zu repräsentieren
59
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
60
Dynamische Datenstrukturen
Dynamische Datenstrukturen werden benutzt, wenn sich die Struktur der Dateneinheiten zur Laufzeit dynamisch verändern kann.
61
Erzeugung dynamischer Datenstrukturen
Erzeugung mit Hilfe von Referenzattributen (Pointer) Erzeugung mit Hilfe vordefinierter KLassen TList; TStringList; TStack; ...
62
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. ...
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.