Begriffe

Werbung
Bäume
8. Allgemeine Bäume und Binärbäume
Bäume gehören zu den wichtigsten Datenstrukturen:
Entscheidungsbäume, Syntaxbäume,
Ableitungsbäume, Codebäume, Suchbäume, ...
Bäume - Überblick
- Orientierte Bäume
- Darstellungsarten
- Geordnete Bäume
Ein Baum ist
ein azyklischer einfacher, zusammenhängender Graph,
d. h. er enthält keine Schleifen und Zyklen: zwischen
jedem Paar von Knoten besteht höchstens eine Kante
Binärbäume: Begriffe und Definitionen
Orientierter Baum: Ein orientierter Baum ist ein
gerichteter, zusammenhängender und zyklenfreier Graph
mit einem ausgezeichneten Knoten (Wurzel). Jeder Knoten
im Graph ist von der Wurzel aus auf genau einem Weg
erreichbar. (Vertikale Orientierung)
Realisierung von Binärbäumen
-
Zeiger-Realisierung
Array-Realisierung
Natürliche Bäume / Suchbäume
(Orientierte) Bäume sind verallgemeinerte Listenstrukturen:
- Wörterbuchoperationen auf Suchbäumen
Element (Knoten) hat i.a. mehrere Nachfolger (Söhne).
Wurzel:
einziger Knoten ohne Vorgänger
Blätter:
Knoten ohne Nachfolger
Durchlaufen von binären Bäumen
-
Preorder-, Inorder-, Postorder-Traversierung
Rekursive und iterative Version
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
Hier im Vordergrund:
Verwendung von Bäumen zur Speicherung von Schlüsseln
und Realisierung der Wörterbuchoperationen (Suchen,
Einfügen, Entfernen) in Binärbäumen.
1
Begriffe
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
2
Darstellung orientierter Bäume
Sei B ein Baum.
1. Mengendarstellung
Ordnung (Grad) von B: Maximale Anzahl von
Nachfolgern eines Knotens
a
Objekte: a, b, c, ...
B1 =
B4
B4 =
b
Bäume: B1 , B 2, B3, ...
x
Pfad der Länge k: Folge p0, ..., pk von Knoten, so daß
gilt: pi Nachfolger von pi-1.
B3=
Höhe eines Baums: maximaler Abstand eines Blattes von
der Wurzel.
B5 = c
d
e
B2 =
B1 B2 B3
B5
f
g
h
2. Klammerdarstellung
Wurzel = erstes Element innerhalb eines
Klammerpaares
Tiefe eines Knotens: Abstand zur Wurzel, d.h. Länge des
Pfades von diesem Knoten bis zur Wurzel. Die Wurzel
hat Niveau 0. Die Knoten auf dem Niveau i sind folglich
alles Knoten mit der Tiefe i.
{x, B1, B2 , B3 }
{x, {a, {b}, {c}}, {d, {e}, {f, {g}}}, {h}}
B1
B3
B2
{a, {b}, {c}} ≡ {a, {c}, {b}}
Innere Knoten: Alle außer Blattknoten.
3. Rekursives Einrücken
Ein Baum der Ordnung n heißt vollständig, wenn alle Blätter
dieselbe Tiefe haben und auf jedem Niveau die maximale
Anzahl von Knoten vorhanden ist.
x
a
x
B1
B2
B3
b
c
⇒
d
e
f
g
h
4. Graphendarstellung
x
B1
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
3
B2
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
B3
Kapitel 8:
Bäume.
4
Darstellungen (2)
Geordnete Bäume
Graphendarstellung
0
Baum B heißt geordnet, wenn Nachfolger jedes Knotens
geordnet sind (1., 2., 3. etc.; linker, rechter). Bei einem
geordneten Baum bilden die Unterbäume Bi jedes Knotens
eine geordnete Menge.
1
Eine geordnete Menge von geordneten Bäumen heißt
Wald.
2
Beispiel:
Stufe (Ebene)
Arithmetischer Ausdruck a * (b - c) + d/e
- Graphendarstellung (Operatorbaum)
3
+
Bezeichnungen
Wurzel:
∗
Blätter:
/
innere Knoten:
Grad (K) = # Nachfolger von K
Grad (x) =
-
a
e
d
Grad (g) =
Grad (Baum) = Max (Grad(Ki)) =
b
Stufe (Ki) = Pfadlänge l von Wurzel nach Ki
Stufe 0:
Stufe 2:
Stufe 1:
Stufe 3:
c
Höhe h =
- Klammerdarstellung
Gewicht w = # der Blätter =
{+, { *, { a }, {-, { b }, { c } } }, { /, { d }, { e } } }
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
5
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
6
Binärbäume (2)
Binärbäume
Satz: Die maximale Anzahl von Knoten eines
Binärbaumes
Definition: Ein Binärbäum ist ein geordneter Baum, in
dem jeder Knoten höchstens zwei Nachfolger besitzt
(Ordnung 2).
(1) auf Stufe i ist 2i , i ≥ 0
(2) der Höhe h ist 2h+1 - 1 , h ≥ 0
Ein Binärbaum ist eine endliche Menge von Elementen,
die entweder leer ist oder ein ausgezeichnetes Element
- die Wurzel des Baumes - besitzt und folgende
Eigenschaften aufweist:
- Die verbleibenden Elemente sind in zwei disjunkte
Untermengen zerlegt.
- Jede Untermenge ist selbst wieder ein Binärbaum und
heißt linker bzw. rechter Unterbaum des
ursprünglichen Baumes
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
7
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
8
Realisierung von Binärbäumen
1. Zeiger-Realisierung
.
.
Lsohn
Binäre Suchbäume (natürliche Binärbäume)
Rsohn
Suchbaumbedingung:
Für jeden Knoten k eines binären Suchbaums B gilt: Die
Schlüssel im linken Teilbaum von k sind sämtlich kleiner
als der Schlüssel S(k) von k, und dieser wiederum ist
kleiner als sämtliche Schlüssel im rechten Teilbaum von k,
d.h. falls die Teilbäume nicht nur aus einem Blatt bestehen
gilt
(1) S(w) < S(k) für alle Knoten w im linken Teilbaum von
B,
(2) S(w) >=S(k) für alle Knoten w im rechten Teilbaum
von B.
Freispeicherverwaltung der Struktur wird von der
Speicherverwaltung des Programmiersystems übernommen
2. Array-Realisierung
(Array a[]: Wir nummerieren die Knoten des Binärbaumes
mit der Wurzel beginnend durch, indem wir jede Ebene von
links nach rechts durchlaufen und dann in die nächste
Ebenene absteigen. Die Knotennummer ist die Position des
Elementes im Feld (erste Feldposition trägt die Nummer 1).
Der linke Nachfolger eines Knotens k steht auf Position 2*k ,
der rechte Nachfolger auf Position 2*k+1.
Für fast vollständige oder zumindest ausgeglichene
Binärbäume bietet die Array- Ralisierung eine sehr elegante
und effiziente Darstellungsform an.
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
Definition:
Ein binärer Suchbaum B =<K,w,S> für eine linear
geordnete Menge M ist ein geordneter, binärer Baum B
=<K,w> mit einer Abbildung S: K->M von der
Knotenmenge K in die Schlüsselmenge M, die die
Suchbaumbedingung erfüllt.
9
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
10
Wörterbuchoperationen (2)
Wörterbuchoperationen
Einfügen eines Schlüssels
Annahme (Suchbaumbedingung):
Folge von (paarweise verschiedenen) Schlüsseln der
Reihe nach in den anfangs leeren Baum so einfügen,
dass immer die Suchbaumbedingung erfüllt bleibt.
Für einen beliebigen Knoten k mit Schlüssel S(k) des
Binärbaumes gilt: Alle im linken Teilbaum von k
gespeicherten Schlüssel sind kleiner als S(k) und S(k)
wiederum ist kleiner als alle Schlüssel im rechten
Teilbaum von k.
Schema zum Einfügen von x:
1.
(1) Suche nach Schlüssel x:
2.
Die Suche nach einem Schlüssel x in einem Baum
(Teilbaum) läuft nach folgendem rekursiven Schema ab:
Man inspiziere den Wurzelknoten des Baumes.
Falls x = Schlüssel des inspizierten Knotens: Suche
beendet. Sonst:
Suche nach Schlüssel x. FERTIG, falls dieser
gefunden. Sonst:
Suche endet an einem Knoten k mit maximal einem
Teilbaum (der aber den Schlüssell nicht enthalten
kann). Hänge an k einen neuen Knoten rechts oder
links gemäß Suchbaumbedingung an und schreibe x
in den neuen Knoten ein.
Das folgende Programm leider nur in PASCAL.
Falls x < Schlüssel des inspizierten Knotens: Setze Suche
im linken Teilbaum fort.
Falls x > Schlüssel des inspizierten Knotens: Setze Suche
im rechten Teilbaum fort.
Maximale Anzahl inspizierter Knoten: Tiefe des Baumes.
Suche innerhalb der Knoten etwa durch lineares oder
binäres Suchen zu realisieren. Da l≤ m, ist Aufwand
dafür konstant.
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
11
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
12
Wörterbuchoperationen (3)
Entfernen eines Schlüssels
Programm Einfügen eines Schlüssels
PROGRAM Baumaufbau (input, output);
TYPE Kptr = ∧Knoten;
Knoten = RECORD
Lsohn, Rsohn : Kptr;
Info : InfoTyp;
Key: integer;
END;
VAR wurzel: Kptr;
k: integer;
•
•
PROCEDURE Einfügen (VAR p: Kptr; k: integer);
{sucht im Baum mit Wurzel p nach Schlüssel x}
BEGIN
IF p= NIL
THEN {neuen Knoten mit Schlüssel k einfügen}
BEGIN new(p); p∧.Lsohn:=NIL;
p∧.Rsohn:=NIL; p∧.key:=k
END
ELSE
IF k<p∧.key
THEN Einfügen (p∧.Lsohn, k)
ELSE
IF k>p∧.key
THEN Einfügen (p∧.Rsohn, k)
ELSE {p∧.key=k}
write('Schlüssel schon vorhanden')
END;
BEGIN {Baumaufbau}
wurzel:=NIL;
WHILE NOT eof(input) DO
BEGIN
read(k); Einfügen (wurzel, k)
END
END
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Das Entfernen eines Schlüssels x gelingt nach
folgendem Schema:
Kapitel 8:
Bäume.
1.
2.
3.
13
Suche nach x. Falls x nicht gefunden STOP.
Ansonsten gibt es (genau) einen Knoten k mit
S(k) = x.
Fälle:
Knoten k ist ein Blattknoten: Entferne diesen.
Knoten k hat nur einen nichtleeren Teilbaum:
Entferne x aus Knoten k und mache diesen zur
Wurzel des Teilbaumes.
Knoten k hat zwei Teilbäume: Suche nach
kleinstem Schlüssel im rechten Teilbaum B_r.
Dieser liege im Knoten q mit Wert y. Ersetze den
Schlüssel x des Knotens k durch y und entferne
den Schlüssel y aus B_r (Fall 2, der linke
Teilbaum von q ist ja leer.).
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Durchlaufen eines Binärbaums
Inorder-Traversierung (LWR)
Baumdurchlauf (tree traversal): Verarbeitung aller
Baumknoten gemäß vorgegebener Strukturierung
Rekursive Version:
14
PROCEDURE LWR (Wurzel : Kptr);
BEGIN
IF
Wurzel <> NIL THEN
LWR (Wurzel^.Lsohn);
Verarbeite (Wurzel^.Info);
LWR (Wurzel^.Rsohn);
END
END LWR;
Rekursiv anzuwendende Schritte:
1. Verarbeite Wurzel:
2. Durchlaufe linken UB:
3. Durchlaufe rechten UB:
Bäume.
W
L
R
Durchlaufprinzip impliziert sequentielle, lineare Ordnung
auf der Menge der Knoten
Iterative Version:
- Ziel: effizientere Ausführung durch eigene Stapelverwaltung
- Vorgehensweise:
Nimm, solange wie möglich, linke Abzweigung und
speichere den zurückgelegten Weg auf einem Stapel.
3 Strategien:
Aktion 1:
1. Vorordnung (preorder):
WLR
2. Zwischenordnung (inorder):
LWR
3. Nachordnung (postorder):
LRW
Wenn es links nicht mehr weitergeht, wird der oberste
Knoten des Stapels ausgegeben und vom Stapel entfernt.
Der Durchlauf wird mit dem rechten Unterbaum des
entfernten Knotens fortgesetzt.
WLR zum Beispiel heißt: Besuche zuerst die Wurzel, und durchlaufe
dann den linken und danach den rechten Unterbaum. Besuchen des
Wurzelknotens impliziert die Ausgabe seines Inhaltes und/oder
Ausführen der Operationen wie sie in dem besuchten Knoten
vorgeschrieben sind. Durchlaufen der Unterbäume erfolgt wieder nach
dem WLR Schema.
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
PUSH(S, Current);
Current := Current^.Lsohn;
Aktion 2: WriteString (TOP(S)^.Info);(*Verarbeite Info *)
Current := TOP(S)^.Rsohn;
POP(S);
15
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Bäume.
16
Iterative Version: Durchlaufbeispiel
+
∗
-
a
b
Stapel S
/
e
d
c
Current^
Aktion
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister).
Kapitel 8:
Ausgabe
Bäume.
17
Herunterladen