Suchen von Knoten

Werbung
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Diskrete Mathematik I
Vorlesung 6
Binärer Suchbaum II
Diskrete Mathe 1
1
2
3
4
5
6
7
Übersicht
•
•
Der Binäre Baum
Binärer Suchbaum
–
Definition
–
Beispiel
–
Die Klasse Knoten
–
Die Klasse Binärer Suchbaum (BST)
–
FügeEin Rekursiv
–
Suchen von Knoten
8
9
10
11
12
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Der Binäre Baum
•
•
Ein leerer Baum ist ein binärer Baum
Sind L und R zwei binäre Bäume und w ein Knoten mit dem Inhalt n, dann ist
die Verknüpfung von w, L und R ein binärer Baum.
n
L
R
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Binärer Suchbaum
•
Ein binärer Baum B ist ein binärer Suchbaum, falls er leer ist oder die folgenden
Eigenschaften erfüllt sind:
–
die beiden Unterbäume sind binäre Suchbäume
–
die Beschriftungen der Knoten des linken Suchbaums sind kleiner als die
Beschriftung der Wurzel
–
die Beschriftungen des rechten Suchbaums sind größer als die Beschriftung
der Wurzel
n
<n
>n
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Binärer Suchbaum
Aufbau eines binären Suchbaums aus folgenden Elementen:
9 4 17 13 2 23 7
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Binärer Suchbaum
9
17
4
2
7
13
23
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Die Klasse Knoten
class Knoten {
private int wert;
private Knoten links, rechts;
Knoten(int i) { wert = i; links = rechts = null; }
void SetzeWert(int i) { wert = i; }
int GibWert() { return wert; }
void SetzeLinks(Knoten k) { links = k; }
Knoten GibLinks() { return links; }
void SetzeRechts(Knoten k) { rechts = k; }
Knoten GibRechts() { return rechts; }
}
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
Die Klasse Binärer Suchbaum (BST)
class BST {
private Knoten Wurzel;
class Knoten {...}
BST() { wurzel = null; }
void FügeEin(int i) {
wurzel = FügeEin(wurzel, i);
}
}
Aufruf
der rekursiven
Prozedur
12
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
FügeEin Rekursiv
private Knoten FügeEin(Knoten aktuell, int ein) {
if (aktuell == null) {
aktuell = new Knoten(ein);}
else {
if (ein < aktuell.GibWert())
aktuell.SetzeLinks(FügeEin(aktuell.GibLinks(), ein));
if (ein > aktuell.GibWert())
aktuell.SetzeRechts(FügeEin(aktuell.GibRechts(), ein));
}
return aktuell;
}
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
Suche einer Zahl k in einem binären Suchbaum B
•
B ist leer
–
k kann nicht im Baum sein.
•
B ist nicht leer
–
B.wert = k : k ist gefunden, d.h. bereits in B vorhanden.
–
B.wert < k : Suche im rechten Unterbaum von B.
–
B.wert > k : Suche im linken Unterbaum von B.
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 15
16
10
24
9
14
13
A 13x
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 15
16
k < 16
10
24
9
14
13
A 13x
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 15
16
10
24
k > 10
9
14
13
A 13x
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 15
16
10
9
24
k > 14
13
A 13x
14
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 15
16
10
24
9
14
13
A 13x
18
15
k = 15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 11
16
k < 16
10
24
9
14
13
A 10x
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 11
16
10
24
k > 10
9
14
13
A 10x
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 11
16
10
9
24
k < 14
13
A 10x
14
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
•
Suche für k = 11
16
10
24
9
k nicht vorhanden
A 10x
14
13
18
15
Diskrete Mathe 1
1
2
3
4
5
6
7
8
9
10
11
12
Suchen von Knoten
class BST {
...
boolean Suche(int i) {
return Suche(wurzel, i);
}
private boolean Suche(Knoten aktuell, int i) {
boolean gefunden = false;
Vergleich
if (aktuell != null) {
gefunden = (aktuell.GibWert() == i) ;
if (aktuell.GibWert() < i)
gefunden = Suche(aktuell.GibRechts(), i);
if (aktuell.GibWert() > i)
gefunden = Suche(aktuell.GibLinks(), i);
}
return gefunden;
}
...}
Herunterladen