Powerpoint-Präsentation

Werbung
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
...
Herunterladen