nil then - TU Dortmund, Informatik 2

Werbung
LS 2 /
Informatik
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 /
Informatik
Organisatorisches
Übungen

Ab der nächsten Heimübung ist die Teilnahme an der Besprechung der
Heimübung nicht mehr verpflichtend
Lernraumbetreuung


Mo 14:30-17:30 in U04 zur C-Betreuung (Praktikum)
Dafür fällt aus: Mo 14:30 – 17:30
Zweiter Test



Aufgabe 1: Nachvollziehen eines Algorithmus oder einer Datenstruktur
Aufgabe 2: Entwurf und Analyse eines Algorithmus zur dynamischen
Programmierung
Aufgabe 3: Entwurf und Analyse eines gierigen Algorithmus
2
LS 2 /
Informatik
Datenstrukturen
Datenstruktur Feld



Platzbedarf Q(max)
Laufzeit Suche: Q(n)
Laufzeit Einfügen/Löschen: Q(1)
Vorteile

Schnelles Einfügen und Löschen
Nachteile


Speicherbedarf abhängig von max (nicht vorhersagbar)
Hohe Laufzeit für Suche
3
LS 2 /
Informatik
Datenstrukturen
Datenstruktur „sortiertes Feld“



Sortiertes Feld A[1,…,max]
Integer n, 1 n  max
n bezeichnet Anzahl Elemente in Datenstruktur
2
A
4
6
7
11
13
nil
nil
nil
nil
n
4
LS 2 /
Informatik
Datenstrukturen
Einfügen(s)
1.
2.
3.
4.
5.
6.
2
n  n+1
in
while s < A[i-1] do
A[i]  A[i-1]
i  i -1
A[i]  s
4
6
7
11
13
nil
nil
nil
nil
n
Einfügen(10)
5
LS 2 /
Informatik
Datenstrukturen
Einfügen(s)
1.
2.
3.
4.
5.
6.
2
n  n+1
in
while s < A[i-1] do
A[i]  A[i-1]
i  i -1
A[i]  s
4
6
7
11
13
nil
nil
nil
nil
n
Einfügen(10)
6
LS 2 /
Informatik
Datenstrukturen
Einfügen(s)
1.
2.
3.
4.
5.
6.
2
n  n+1
in
while s < A[i-1] do
A[i]  A[i-1]
i  i -1
A[i]  s
4
6
7
11
13
nil
nil
nil
nil
n
Einfügen(10)
7
LS 2 /
Informatik
Datenstrukturen
Einfügen(s)
1.
2.
3.
4.
5.
6.
2
n  n+1
in
while s < A[i-1] do
A[i]  A[i-1]
i  i -1
A[i]  s
4
6
7
11
11
13
nil
nil
nil
n
Einfügen(10)
8
LS 2 /
Informatik
Datenstrukturen
Einfügen(s)
1.
2.
3.
4.
5.
6.
2
Laufzeit O(n)
n  n+1
in
while s < A[i-1] do
A[i]  A[i-1]
i  i -1
A[i]  s
4
6
7
10
11
13
nil
nil
nil
n
Einfügen(10)
9
LS 2 /
Informatik
Datenstrukturen
Parameter ist der
Index des zu
löschenden Objekts
Löschen(i)
1.
2.
3.
4.
2
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
4
6
7
11
13
nil
nil
nil
nil
n
10
LS 2 /
Informatik
Datenstrukturen
Parameter ist der
Index des zu
löschenden Objekts
Löschen(i)
1.
2.
3.
4.
2
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
4
6
7
11
13
nil
nil
nil
nil
n
Löschen(2)
11
LS 2 /
Informatik
Datenstrukturen
Parameter ist der
Index des zu
löschenden Objekts
Löschen(i)
1.
2.
3.
4.
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
i
2
4
6
7
11
13
nil
nil
nil
nil
n
Löschen(2)
12
LS 2 /
Informatik
Datenstrukturen
Löschen(i)
1.
2.
3.
4.
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
i
2
4
6
7
11
13
nil
nil
nil
nil
n
Löschen(2)
13
LS 2 /
Informatik
Datenstrukturen
Löschen(i)
1.
2.
3.
4.
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
i
2
6
7
11
13
13
nil
nil
nil
nil
n
Löschen(2)
14
LS 2 /
Informatik
Datenstrukturen
Löschen(i)
1.
2.
3.
4.
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
i
2
6
7
11
13
nil
nil
nil
nil
nil
n
Löschen(2)
15
LS 2 /
Informatik
Datenstrukturen
Löschen(i)
1.
2.
3.
4.
for j  i to n-1 do
A[j]  A[j+1]
A[n]  nil
n  n-1
i
2
6
7
11
13
nil
nil
nil
nil
nil
n
Löschen(2)
16
LS 2 /
Informatik
Datenstrukturen
Suchen(x)


Binäre Suche
Laufzeit O(log n)
i
2
6
7
11
13
nil
nil
nil
nil
nil
n
Löschen(2)
17
LS 2 /
Informatik
Datenstrukturen
Datenstruktur sortiertes Feld



Platzbedarf Q(max)
Laufzeit Suche: Q(log n)
Laufzeit Einfügen/Löschen: Q(n)
Vorteile

Schnelles Suchen
Nachteile


Speicherbedarf abhängig von max (nicht vorhersagbar)
Hohe Laufzeit für Einfügen/Löschen
18
LS 2 /
Informatik
Datenstrukturen
Doppelt verkettete Listen





Listenelement x ist Objekt bestehend aus Schlüssel und zwei Zeigern prev
und next
next verweist auf Nachfolger von x
prev verweist auf Vorgänger von x
prev/next sind nil, wenn Vorgänger/Nachfolger nicht existiert
head[L] zeigt auf das erste Element
prev
head[L]
nil
5
next
7
Schlüssel
4 nil
19
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
head[L]
nil
7
4 nil
20
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
x
5
head[L]
nil
7
4 nil
21
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
x
5
head[L]
7
4 nil
22
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
x
head[L]
5
7
4 nil
23
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
x
head[L]
nil
5
7
4 nil
24
LS 2 /
Informatik
Datenstrukturen
Einfügen(L,x)
1. next[x]  head[L]
2. if head[L]  nil then prev[head[L]]  x
3. head[L]  x
4. prev[x]  nil
Laufzeit
•
O(1)
x
head[L]
nil
5
7
4 nil
25
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
head[L]
nil
5
7
4 nil
26
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
head[L]
nil
5
x
7
4 nil
27
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
head[L]
nil
5
x
7
4 nil
28
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
head[L]
nil
4 nil
5
7
x
29
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
head[L]
nil
5
4 nil
30
LS 2 /
Informatik
Datenstrukturen
Löschen(L,x)
1. if prev[x]  nil then next[prev[x]]  next[x]
2. else head[L]  next[x]
3. if next[x]  nil then prev[next[x]]  prev[x]
4. delete x
Laufzeit
•
O(1)
head[L]
nil
5
4 nil
31
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
32
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
head[L]
nil
5
4 nil
33
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
x
head[L]
nil
Suche(L,4)
5
4 nil
34
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
head[L]
nil
Suche(L,4)
5
4 nil
35
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
head[L]
nil
Suche(L,4)
5
x
4 nil
36
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
head[L]
nil
Suche(L,4)
5
x
4 nil
37
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
head[L]
nil
Suche(L,4)
5
x
4 nil
38
LS 2 /
Informatik
Datenstrukturen
Suche(L,k)
1. x  head[L]
2. while xnil and key[x]k do
3.
x  next[x]
4. return x
Laufzeit
•
O(n)
head[L]
nil
Suche(L,4)
5
x
4 nil
39
LS 2 /
Informatik
Datenstrukturen
Datenstruktur Liste:



Platzbedarf Q(n)
Laufzeit Suche: Q(n)
Laufzeit Einfügen/Löschen: Q(1)
Vorteile


Schnelles Einfügen/Löschen
O(n) Speicherbedarf
Nachteile

Hohe Laufzeit für Suche
40
LS 2 /
Informatik
Datenstrukturen
Drei grundlegende Datenstrukturen



Feld
sortiertes Feld
doppelt verkettete Liste
Diskussion



Alle drei Strukturen haben gewichtige Nachteile
Zeiger/Referenzen helfen beim Speichermanagement
Sortierung hilft bei Suche ist aber teuer aufrecht zu erhalten
41
LS 2 /
Informatik
Datenstrukturen
Binärbäume




key
Schlüssel key und ggf. weitere Daten
Vaterzeiger p[v] auf Vater von v (blau)
Zeiger lc[v] (rc[v]) auf linkes (rechtes) Kind von v
Wurzelzeiger root[T]
p[v]
lc[v] rc[v]
root[T]
/
/
/
/
/
/
/
/
/
42
LS 2 /
Informatik
Datenstrukturen
6
Binäre Suchbäume


Verwende Binärbaum
Speichere Schlüssel „geordnet“
7
4
3
7
9
Binäre Suchbaumeigenschaft:



Sei x Knoten im binären Suchbaum
Ist y Knoten im linken Unterbaum von x, dann gilt key[y]key[x]
Ist y Knoten im rechten Unterbaum von x, dann gilt key[y]>key[x]
43
LS 2 /
Informatik
Datenstrukturen
Unterschiedliche Suchbäume


Schlüsselmenge 3,4,6,7,7,9
Wir erlauben mehrfache Vorkommen desselben Schlüssels
3
6
3
6
7
4
7
9
7
4
7
9
44
LS 2 /
Informatik
Datenstrukturen
Ausgabe aller Schlüssel


Gegeben binärer Suchbaum
Wie kann man alle Schlüssel aufsteigend sortiert in Q(n) Zeit ausgeben?
6
7
4
3
7
9
45
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Aufruf über
Inorder-Tree-Walk(root[T])
6
7
4
3
7
9
46
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
6
7
4
3
7
9
47
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
6
7
4
3
7
9
48
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
6
7
4
3
7
9
49
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
6
7
4
3
7
9
50
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
6
7
4
3
7
9
51
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Kein linkes Kind
vorhanden, d.h.
lc[x]=nil
x 3
6
7
4
7
9
52
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Kein linkes Kind
vorhanden, d.h.
lc[x]=nil
x 3
6
7
4
7
9
53
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3
6
7
4
3
7
9
54
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3
6
Kein rechtes Kind
vorhanden, d.h.
rc[x]=nil
7
4
3
7
9
55
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3
6
Kein rechtes Kind
vorhanden, d.h.
rc[x]=nil
7
4
3
7
9
56
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3
6
Knoten
abgearbeitet
3
7
4
7
9
57
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4
6
7
4
3
7
9
58
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4
6
7
4
3
nil
7
9
59
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4
6
7
4
3
nil
7
9
60
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4
6
7
4
3
7
9
61
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
62
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
63
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
64
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
65
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
66
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
67
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6
6
7
4
3
7
9
68
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7
6
7
4
3
7
9
69
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7
6
7
4
3
7
9
70
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7
6
7
4
3
9
7
71
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7
6
7
4
3
7
9
72
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7
6
7
4
3
7
9
73
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7
6
7
4
3
7
9
74
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7
6
7
4
3
7
9
75
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7
6
7
4
3
7
9
76
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7
6
7
4
3
9
7
77
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
78
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
79
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
80
nil
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
81
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
82
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
83
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
84
LS 2 /
Informatik
Datenstrukturen
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Ausgabe:
3, 4, 6, 7, 7, 9
6
7
4
3
7
9
85
LS 2 /
Informatik
Datenstrukturen
Lemma 37

Inorder-Tree-Walk gibt die Schlüssel eines binären Suchbaums in
aufsteigender Reihenfolge aus.
86
LS 2 /
Informatik
Datenstrukturen
„Normale“ Induktion
•
•
Wir wollen zeigen, dass Aussage A(i) für alle natürlichen Zahlen i gilt
Dazu beweisen wir, dass
•
•
(a) A(1) gilt
(b) Wenn A(i) gilt, dann gilt auch A(i+1)
•
•
•
(a) heißt Induktionsanfang
(b) nennt man Induktionsschluss (oder auch Induktionsschritt)
Die Vorraussetzung in (b) (also A(i)) heißt Induktionsvoraussetzung
87
LS 2 /
Informatik
Datenstrukturen
Induktion über die Struktur von Binärbäumen
•
•
•
Wollen zeigen, dass Aussage für alle Binärbäume gilt:
(a) Zeige Induktionsanfang für „kleine Binärbäume“
(b) Setze größere Bäume aus kleinen Binärbäumen zusammen, d.h.
Aussage gilt
für Bäume A
und B
A
B
88
LS 2 /
Informatik
Datenstrukturen
Induktion über die Struktur von Binärbäumen
•
•
•
Wollen zeigen, dass Aussage für alle Binärbäume gilt:
(a) Zeige Induktionsanfang für „kleine Binärbäume“
(b) Setze größere Bäume aus kleinen Binärbäumen zusammen, d.h.
Dann gilt
Aussage auch für
neuen Baum mit
Wurzel v
v
A
B
89
LS 2 /
Informatik
Datenstrukturen
Definition
•
Die Höhe eines Binärbaums mit Wurzel v ist die Länge (Anzahl Kanten)
des längsten einfachen Weges (keine mehrfach vorkommenden Knoten)
von der Wurzel zu einem Blatt.
Beispiel
•
Baum der Höhe 3
v
90
LS 2 /
Informatik
Datenstrukturen
Definition
•
Die Höhe eines Binärbaums mit Wurzel v ist die Länge (Anzahl Kanten)
des längsten einfachen Weges (keine mehrfach vorkommenden Knoten)
von der Wurzel zu einem Blatt.
Beispiel
•
Baum der Höhe 1
v
91
LS 2 /
Informatik
Datenstrukturen
Definition
•
Die Höhe eines Binärbaums mit Wurzel v ist die Länge (Anzahl Kanten)
des längsten einfachen Weges (keine mehrfach vorkommenden Knoten)
von der Wurzel zu einem Blatt.
Beispiel
•
Baum der Höhe 0
v
92
LS 2 /
Informatik
Datenstrukturen
Definition
•
Die Höhe eines Binärbaums mit Wurzel v ist die Länge (Anzahl Kanten)
des längsten einfachen Weges (keine mehrfach vorkommenden Knoten)
von der Wurzel zu einem Blatt.
Beispiel
•
•
v
Übereinkunft: Ein leerer Baum hat Höhe -1
Damit gilt:
Höhe eines Baumes mit Wurzel v und
Teilbäumen A und B ist
1 + max{ Höhe(A), Höhe(B)}
A
B
93
LS 2 /
Informatik
Datenstrukturen
Induktion über die Struktur von Binärbäumen
•
•
•
Wir wollen Aussage A(i) durch Induktion über die Höhe von Bäumen
zeigen
(a) Zeige die Aussage für leere Bäume (Bäume der Höhe -1)
(b) Zeige: Gilt die Aussage für Bäume der Höhe i, so gilt sie auch für
Bäume der Höhe i+1
v
B
A
94
LS 2 /
Informatik
Datenstrukturen
Induktion über die Struktur von Binärbäumen
•
•
•
•
Wir wollen Aussage A(i) durch Induktion über die Höhe von Bäumen
zeigen
(a) Zeige die Aussage für leere Bäume (Bäume der Höhe -1)
(b) Zeige: Gilt die Aussage für Bäume der Höhe i, so gilt sie auch für
Bäume der Höhe i+1
v
Dabei können wir immer annehmen,
dass ein Baum der Höhe i+1 aus einer
Wurzel v und zwei Teilbäumen A,B
besteht, so dass
(1) A und B Höhe maximal i haben und
(2) A oder B Höhe i hat
Höhe
i+1
B
A
95
LS 2 /
Informatik
Datenstrukturen
Induktion über die Struktur von Binärbäumen
•
•
•
•
Wir wollen Aussage A(i) durch Induktion über die Höhe von Bäumen
zeigen
(a) Zeige die Aussage für leere Bäume (Bäume der Höhe -1)
(b) Zeige: Gilt die Aussage für Bäume der Höhe i, so gilt sie auch für
Bäume der Höhe i+1
v
Dabei können wir immer annehmen,
dass ein Baum der Höhe i+1 aus einer
Wurzel v und zwei Teilbäumen A,B
besteht, so dass
(1) A und B Höhe maximal i haben und
(2) A oder B Höhe i hat
Höhe
i
B
A
96
LS 2 /
Informatik
Datenstrukturen
Lemma 37

Inorder-Tree-Walk gibt die Schlüssel
eines binären Suchbaums in aufsteigender
Reihenfolge aus.
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Beweis



(I.A.) Ist die Eingabe ein leerer Baum, so wird
Inorder-Tree-Walk nil übergeben. Damit bricht der
Algorithmus sofort ab. Es gibt also keine Ausgabe,
was auch korrekt ist.
(I.V.) Das Lemma gilt für Bäume der Höhe ≤i.
(I.S.) Wir müssen zeigen, dass das Lemma auch für
Höhe i+1≥0. Dazu betrachten wir den Inorder-Tree-Walk
auf einem solchem Baum.
v
B
A
97
LS 2 /
Informatik
Datenstrukturen
Lemma 37

Inorder-Tree-Walk gibt die Schlüssel
eines binären Suchbaums in aufsteigender
Reihenfolge aus.
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Beweis

(I.S.) Wir müssen zeigen, dass das Lemma auch für
Höhe i+1≥0. Dazu betrachten wir den Inorder-Tree-Walk
auf einem solchem Baum. Da der Baum Höhe mindestens
0 hat, wird der Algorithmus nicht mit nil aufgerufen.
Damit wird Zeile 2 ausgeführt. Dort wird Inorder-Tree-Walk
rekursiv mit dem Teilbaum A der Höhe ≤i ausgeführt.
Nach (I.V.) werden die Schlüssel aus A in aufsteigender
Reihenfolge ausgegeben
v
B
A
98
LS 2 /
Informatik
Datenstrukturen
Lemma 37

Inorder-Tree-Walk gibt die Schlüssel
eines binären Suchbaums in aufsteigender
Reihenfolge aus.
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Beweis

Nach (I.V.) werden die Schlüssel aus A in aufsteigender
Reihenfolge ausgegeben. Dann wird in Zeile 3 key[v]
ausgegeben. Wegen der Suchbaumeigenschaft
ist key[v] größer gleich allen Schlüsseln in A und kleiner
als alle Schlüssel in B. In Zeile 4 wird dann
Inorder-Tree-Walk rekursiv für Teilbaum B aufgerufen.
Die dort gespeicherten Schlüssel werden nach (I.V.)
ebenfalls in aufsteigender Reihenfolge ausgegeben.
v
B
A
99
LS 2 /
Informatik
Datenstrukturen
Lemma 37

Inorder-Tree-Walk gibt die Schlüssel
eines binären Suchbaums in aufsteigender
Reihenfolge aus.
Inorder-Tree-Walk(x)
1. if xnil then
2. Inorder-Tree-Walk(lc[x])
3. Ausgabe key[x]
4. Inorder-Tree-Walk(rc[x])
Beweis

Zusammenfassend werden also erst die Schlüssel in
Teilbaum A in aufsteigender Reihenfolge ausgegeben.
Dann folgt key[v] und dann die Schlüssel aus B in
aufsteigender Reihenfolge. Aufgrund der Suchbaumeigenschaft ist die gesamte Folge aufsteigend
sortiert.
v
B
A
100
LS 2 /
Informatik
Datenstrukturen
Suchen in Binärbäumen


Gegeben ist Schlüssel k
Gesucht ist ein Knoten mit Schlüssel k
6
7
4
3
7
9
101
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
6
7
4
3
7
9
102
LS 2 /
Informatik
Datenstrukturen
Aufruf mit
x=root[T]
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
103
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
104
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
105
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
106
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
107
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
108
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Baumsuche(root[T],9)
6
7
4
3
7
9
109
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Ausgabe: 9
Baumsuche(root[T],9)
6
7
4
3
7
9
110
LS 2 /
Informatik
Datenstrukturen
Baumsuche(x,k)
1. if x=nil or k=key[x] then return x
2. if k<key[x] then return Baumsuche(lc[x],k)
3. else return Baumsuche(rc[x],k)
Laufzeit: O(h)
6
7
4
Höhe h
3
7
9
111
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
6
7
4
3
7
9
112
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Aufruf mit
x=root[T]
6
7
4
3
7
9
113
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Aufruf mit
x=root[T]
Baumsuche(root[T],5)
6
7
4
3
7
9
114
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
x
Baumsuche(root[T],5)
6
7
4
3
7
9
115
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Baumsuche(root[T],5)
6
x
3
7
4
7
9
116
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Baumsuche(root[T],5)
6
x
3
7
4
7
9
117
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Aufruf mit
x=root[T]
Baumsuche(root[T],5)
6
x
3
7
4
7
9
118
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Baumsuche(root[T],5)
6
7
4
3
x nil
7
9
119
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Baumsuche(root[T],5)
6
7
4
3
x nil
7
9
120
LS 2 /
Informatik
Datenstrukturen
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
Baumsuche(root[T],5)
6
7
4
3
x nil
7
9
121
LS 2 /
Informatik
Datenstrukturen
Funktionsweise wie (rekursive)
Baumsuche. Laufzeit ebenfalls O(h).
IterativeBaumsuche(x,k)
1. while xnil and kkey[x] do
2. if k<key[x] then x  lc[x]
3. else x  rc[x]
4. return x
6
7
4
3
7
9
122
LS 2 /
Informatik
Datenstrukturen
Minimum- und Maximumsuche


Suchbaumeigenschaft:
Alle Knoten im rechten Unterbaum eines Knotens x sind größer key[x]
Alle Knoten im linken Unterbaum von x sind  key[x]
6
7
4
3
7
9
123
LS 2 /
Informatik
Datenstrukturen
Wird mit Wurzel
aufgerufen
MinimumSuche(x)
1. while lc[x]nil do x  lc[x]
2. return x
6
7
4
3
7
9
124
LS 2 /
Informatik
Datenstrukturen
Wird mit Wurzel
aufgerufen
Laufzeit O(h)
MinimumSuche(x)
1. while lc[x]nil do x  lc[x]
2. return x
6
7
4
3
7
9
125
LS 2 /
Informatik
Datenstrukturen
Wird mit Wurzel
aufgerufen
Laufzeit O(h)
MaximumSuche(x)
1. while rc[x]nil do x  rc[x]
2. return x
6
7
4
3
7
9
126
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche


Nachfolger bzgl. Inorder-Tree-Walk
Wenn alle Schlüssel unterschiedlich, dann ist das der nächstgrößere
Schlüssel
6
7
4
3
7
9
127
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 1 (rechter Unterbaum von x nicht leer):
Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x
6
7
4
3
7
9
128
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 1 (rechter Unterbaum von x nicht leer):
Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x
6
7
4
3
7
9
129
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 1 (rechter Unterbaum von x nicht leer):
Dann ist der linkeste Knoten im rechten Unterbaum der Nachfolger von x
6
7
4
3
7
9
130
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y):
Dann ist y der erste Knoten auf dem Pfad zur Wurzel, der größer als x ist
6
7
4
3
5
9
131
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y):
Dann ist y der erste Knoten auf dem Pfad zur Wurzel, der größer als x ist
6
7
4
3
5
9
132
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche

Fall 2 (rechter Unterbaum von x leer und x hat Nachfolger y):
Dann ist y der erste Knoten auf dem Pfad zur Wurzel, der größer als x ist
6
7
4
3
5
9
133
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
6. return y
6
7
4
3
5
9
134
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(6)
6. return y
6
7
4
3
5
9
135
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(6)
6. return y
6
7
4
3
5
9
136
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(6)
6. return y
6
7
4
3
5
9
137
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
7
4
3
5
9
138
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
7
4
3
5
9
139
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
y
3
7
4
5
9
140
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
y
3
7
4
5
9
141
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
y
3
7
4
5 x
9
142
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
6. return y
6
y
3
7
4 x
5
9
143
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
y 6
6. return y
7
4 x
3
5
9
144
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
y 6
6. return y
7
4 x
3
5
9
145
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
Nachfolgersuche(5)
y 6
6. return y
7
4 x
3
5
9
146
LS 2 /
Informatik
Datenstrukturen
Nachfolgersuche(x)
1. if rc[x]  nil then return MinimumSuche(rc[x])
2. y  p[x]
3. while y  nil and x=rc[y] do
4.
xy
5.
y  p[y]
6. return y
6
7
4
3
Laufzeit O(h)
5
9
147
LS 2 /
Informatik
Datenstrukturen
Vorgängersuche


Laufzeit O(h)
Symmetrisch zu Nachfolgersuche
Daher ebenfall O(h) Laufzeit
6
7
4
3
5
9
148
LS 2 /
Informatik
Datenstrukturen
Binäre Suchbäume




Aufzählen der Elemente mit Inorder-Tree-Walk in O(n) Zeit
Suche in O(h) Zeit
Minimum/Maximum in O(h) Zeit
Vorgänger/Nachfolger in O(h) Zeit
Dynamische Operationen?



Einfügen und Löschen
Müssen Suchbaumeigenschaft aufrecht erhalten
Auswirkung auf Höhe des Baums?
149
LS 2 /
Informatik
Datenstrukturen
Einfügen


Ähnlich wie Baumsuche: Finde Blatt, an das neuer Knoten angehängt wird
Danach wird nil-Zeiger durch neues
Element ersetzt
6
7
4
3
5
9
150
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
6
7
4
3
5
9
151
LS 2 /
Informatik
Datenstrukturen
y wird Vater des
einzufügenden
Elements
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
x
6
7
4
3
5
9
152
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
x
6
7
4
3
5
9
153
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
x
6
7
4
3
y
5
9
154
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
x
6
7
4
3
y
5
9
155
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y
5
x
9
156
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y
5
x
9
157
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
y 7
4
3
5
x
9
158
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
y 7
4
3
5
x
9
159
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
y 7
4
3
5
9
160
x
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
y 7
4
3
5
9
161
x
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
5
y 9 x
162
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y 9
5
x nil
163
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y 9
5
x nil
164
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y 9
5
x nil
165
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y 9
5
x 8
166
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Einfügen(8)
6
7
4
3
y 9
5
x 8
167
LS 2 /
Informatik
Datenstrukturen
Einfügen(T,z)
1. y nil; x  root[T]
2. while xnil do
3.
yx
4.
if key[z] < key[x] then x  lc[x]
5.
else x  rc[x]
6. p[z]  y
7. if y=nil then root[T]  z
8. else
9.
if key[z]< key[y] then lc[y]  z
10. else rc[y]  z
Laufzeit O(h)
6
7
4
3
5
9
8
168
LS 2 /
Informatik
Datenstrukturen
Löschen




3 unterschiedliche Fälle
(a) zu löschendes Element z hat keine Kinder
(b) zu löschendes Element z hat ein Kind
(c) zu löschendes Element z hat zwei Kinder
6
7
4
3
5
9
169
LS 2 /
Informatik
Datenstrukturen
Fall (a)

zu löschendes Element z hat keine Kinder
6
7
4
3
5
9
170
LS 2 /
Informatik
Datenstrukturen
Fall (a)


zu löschendes Element z hat keine Kinder
Entferne Element
6
7
4
3
6
5
4
9
3
7
9
171
LS 2 /
Informatik
Datenstrukturen
Fall (b)

Zu löschendes Element z hat 1 Kind
6
7
4
3
5
9
172
LS 2 /
Informatik
Datenstrukturen
Fall (b)

Zu löschendes Element z hat 1 Kind
6
7
4
3
6
5
9
4
9
3
5
173
LS 2 /
Informatik
Datenstrukturen
Fall (c)

Zu löschendes Element z hat 2 Kinder
6
7
4
3
5
9
174
LS 2 /
Informatik
Datenstrukturen
Fall (c)


Zu löschendes Element z hat 2 Kinder
Schritt 1: Bestimme Nachfolger von z
6
7
4
3
5
9
175
LS 2 /
Informatik
Datenstrukturen
Fall (c)


Nachfolger
hat nur ein
Kind
Zu löschendes Element z hat 2 Kinder
Schritt 1: Bestimme Nachfolger von z
6
7
4
3
6
5
9
4
9
3
5
176
LS 2 /
Informatik
Datenstrukturen
Fall (c)



Zu löschendes Element z hat 2 Kinder
Schritt 1: Bestimme Nachfolger von z
Schritt 2: Entferne Nachfolger
6
7
4
3
6
5
9
4
9
3
5
177
LS 2 /
Informatik
Datenstrukturen
Fall (c)




Zu löschendes Element z hat 2 Kinder
Schritt 1: Bestimme Nachfolger von z
Schritt 2: Entferne Nachfolger
Schritt 3: Ersetze z durch Nachfolger
6
7
4
3
7
5
9
4
9
3
5
178
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
6
7
4
3
5
9
179
LS 2 /
Informatik
Referenz auf z wird
Datenstrukturen
übergeben!
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
6
7
4
3
5
9
180
LS 2 /
Informatik
Bestimme Knoten, der
gelöscht werden soll.
Der Knoten hat nur
einen Nachfolger
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
z 6
7
4
3
5
9
181
LS 2 /
Informatik
Bestimme Knoten, der
gelöscht werden soll.
Der Knoten hat nur
einen Nachfolger
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
z 6
7 y
4
3
5
9
182
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
Bestimme das Kind
1. if lc[z]=nil or rc[z]=nil then y  z
von y, falls existent
2. else y  NachfolgerSuche(z)
Löschen(6)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
z 6
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
4
8.
else rc[p[y]]  x
9. key[z]  key[y]
3
5
7 y
9 x
183
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
Aktualisiere
2. else y  NachfolgerSuche(z) Vaterzeiger von x Löschen(6)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
z 6
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
4
8.
else rc[p[y]]  x
9. key[z]  key[y]
3
5
7 y
9 x
184
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
z 6
7 y
4
3
5
9 x
185
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
Löschen(6)
3. if lc[y]  nil then x  lc[y]
Das rechte Kind von
4. else x  rc[y]
z wird x.
z 6
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
4
8.
else rc[p[y]]  x
9. key[z]  key[y]
3
5
7 y
9 x
186
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
Löschen(6)
3. if lc[y]  nil then x  lc[y]
Das rechte Kind von
4. else x  rc[y]
z wird x.
z 6
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
4
8.
else rc[p[y]]  x
9. key[z]  key[y]
3
5
7 y
9 x
187
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T] 
x
Umkopieren
des
7. else if y=lc[p[y]] then lc[p[y]]
x y nach z
Inhalts
von
8.
else rc[p[y]]  x
9. key[z]  key[y]
3
Löschen(6)
z 7
4
5
9 x
188
LS 2 /
Informatik
Datenstrukturen
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
z 7
4
3
9
5
189
LS 2 /
Informatik
Datenstrukturen
Laufzeit O(h)
Löschen(T,z)
1. if lc[z]=nil or rc[z]=nil then y  z
2. else y  NachfolgerSuche(z)
3. if lc[y]  nil then x  lc[y]
4. else x  rc[y]
5. if x  nil then p[x]  p[y]
6. if p[y]=nil then root[T]  x
7. else if y=lc[p[y]] then lc[p[y]]  x
8.
else rc[p[y]]  x
9. key[z]  key[y]
Löschen(6)
z 7
4
3
9
5
190
LS 2 /
Informatik
Datenstrukturen
Binäre Suchbäume



Ausgabe aller Elemente in O(n)
Suche, Minimum, Maximum, Nachfolger in O(h)
Einfügen, Löschen in O(h)
Frage

Wie kann man eine „kleine“ Höhe unter Einfügen und Löschen
garantieren?
191
Herunterladen