View
106
Download
0
Category
Preview:
Citation preview
FH-Hof
Sortieren mit Binären Bäumen
Richard Göbel
FH-Hof
Beispielanwendung
Speichere alle Studierenden
Beantworte folgende Anfragen
Student/Studentin mit gegebener
Matrikelnummer finden
Studierende im 4. Semester finden
Studierende zwischen 3. und. 6. Semester finden
FH-Hof
Klassendefinition für Student
public class Student extends Person{
static ArrayList<Person> studenten;
int matrikelnummer;Vorlesung[] vorlesungenint anzVorlesungen;int semester,
static{
studenten = new ArrayList<Person>();}
Student ( … ){
studenten.add(this);…
}}
FH-Hof
Suchfunktionen
public class Student extends Person{
… static Student search(int matrikel) { … }
static Student search(int semester){
… }
static Student search(int minSem, int maxSem){
… }
…}
FH-Hof
Analyse des Zeitaufwands
Suchen bei
unsortierter Liste
sortierter Liste
Sortierkriterium?
Aufwand für weitere Operationen bei sortierten
Listen
Einfügen
Ändern
Löschen
Hilft die Datenstruktur LinkedList?
Alternative Datenstruktur: Bäume
FH-Hof
Sortierte Binäre Bäume
Jeder Knoten hat höchsten zwei Nachfolger
Alle Knoten im linken Teilbaum sind kleiner als die Wurzel
Alle Knoten im rechten Teilbaum sind größer als die Wurzel
Gleiche Elemente?
8
4 10
6 9 11
5 7 12
FH-Hof
Binärer Baum: Definition eines Knotens
class Node
{
int value;
Node left = null;
Node right = null;
}
FH-Hof
Binärer Baum: Suche nach Werten
Node search(int v)
{
if (v == value) return this;
if (v < value)
if (left == null) return null;
else return left.search(v);
else // v >= value
if (right == null) return null;
else return right.search(v);
}
FH-Hof
Binärer Baum: Einfügen von Werten
void insert(int v){ if (v == value) // neuen Eintrag einfuegen else if (v < value) if (left == null) { left = new Node();
left.value = v; }
else left.insert(v) else // v > n.value if (n.right == null) {
right = new Node(); right.value = v; }
else right.insert(v);}
FH-Hof
Binärer Baum: Löschen eines Knotens - Fälle
Knoten ohne Nachfolger
Knoten mit einem
Nachfolger
Knoten mit zwei
Nachfolgern
8
4 10
6 9 11
5 7 12
FH-Hof
Binärer Baum: Löschen eines Knotens - Code I
Node delete(int v) {
if (v == value) {
if (left == null) return right;if (right == null) return left;if (right.left == null){ value = right.value; right = right.right;
return this;}
else {
value = right.deleteMin(); return this;}
} . . .
FH-Hof
Binärer Baum: Löschen eines Knotens - Code II
. . .
if (v < value)
{
if (left != null) left = left.delete(v);
return this;
}
else // v > value
{
if (right != null) right = right.delete(v);
return n;
}
}
FH-Hof
Implementierung von deleteMin?
int deleteMin(Node n)
{
. . .
}
FH-Hof
Binärer Baum – Kapselung
Klasse für den Einstiegclass BinTree
{
Node content = null;
int size = 0;
}
Entsprechende Funktionen definierenNode search(int v) …
void insert(int v) …
void delete(int v) …
Klasse "Node" ist nur lokal wichtig
FH-Hof
Binärer Baum - Weitere Dienstleistungen
Sortierte Ausgabe aller Einträge
Sortierte Ausgabe aller Einträge größer
(kleiner) als ein vorgegebener Wert
Sortierte Ausgabe aller Einträge zwischen zwei
Werten
FH-Hof
Binärer Baum - Sortierte Ausgabe aller Einträge
void printAll()
{
if (left != null) left.printAll();
System.out.println(value);
if (right != null) right.printAll();
}
FH-Hof
Binärer Baum - Einträge größer als ein Wert
void printAbove(int min)
{
if (value < min)
{
if (right != null) right.printAbove(min);
}
else // value >= min
{
if (left != null) right.printAbove(min);
println(root.value);
if (right != null) right.printAll();
}
}
FH-Hof
Binärer Baum - Einträge in einem Bereich I
void printBetween(int min,int max) {
if (value < min) // nur rechts suchen{
if (right != null) right.printBetween(min,max);}else if (value > max) // nur links suchen {
if (left != null) left.printBetween(min, max);}else // value zwischen min und max{
if (left != null) left.printAbove(min);println(root.value);if (right != null) right.printBelow(max);
}}
FH-Hof
Problem - Bäume mit langen Ästen
1
2
3
4
5
6
1
2
3
4
5
6
FH-Hof
Lösung: (fast) balancierte Bäume
Höhendifferenz des linken und rechten
Teilbaums für jeden Knoten ist maximal k (k in
der Regel 1)
Beispiele:
Rot-Schwarz-Baum
AVL-Baum (G. M. Adel'son-Vel'skii und Y. M.
Landis)
Idee: Lokale Reorganisation des Baumes
möglich
FH-Hof
Lokale Transformation eines binären Baumes
X
YA
B C
X
Y
A B
C
FH-Hof
Transformationen des AVL-Baumes - Teil1
x
y
z
A
B
C D
n
n n+1
n+2
x
y
z
A B C Dn n
n+1
n+2
n+1
x
y
z
A
D
B C
n
nn+1
n+2
x
z
y
A B C Dn n
n+1
n+2
n+1
n n
FH-Hof
Transformationen des AVL-Baumes - Teil 2
x
y
z
D
C
A B
n
nn+1
n+2
z
y
x
A B C D
n+1
n+2
n+1
nn
x
y
z
D
A
B C
n
n n+1
n+2
y
z
x
A B C Dn n
n+1
n+2
n+1
n n
Recommended