Sortieren mit Binären Bäumen Richard Göbel
Speichere alle Studierenden Beantworte folgende Anfragen 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
Klassendefinition für Student public class Student extends Person { static ArrayList<Person> studenten; int matrikelnummer; Vorlesung[] vorlesungen int anzVorlesungen; int semester, static studenten = new ArrayList<Person>(); } Student ( … ) studenten.add(this); …
Suchfunktionen public class Student extends Person { … static Student search(int matrikel) } static Student search(int semester) static Student search(int minSem, int maxSem)
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
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?
Binärer Baum: Definition eines Knotens class Node { int value; Node left = null; Node right = null; }
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); }
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);
Binärer Baum: Löschen eines Knotens - Fälle Knoten ohne Nachfolger Knoten mit einem Nachfolger Knoten mit zwei Nachfolgern
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(); . . .
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;
Implementierung von deleteMin? int deleteMin(Node n) { . . . }
Binärer Baum – Kapselung Klasse für den Einstieg class BinTree { Node content = null; int size = 0; } Entsprechende Funktionen definieren Node search(int v) … void insert(int v) … void delete(int v) … Klasse "Node" ist nur lokal wichtig
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
Binärer Baum - Sortierte Ausgabe aller Einträge void printAll() { if (left != null) left.printAll(); System.out.println(value); if (right != null) right.printAll(); }
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();
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);
Problem - Bäume mit langen Ästen
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
Lokale Transformation eines binären Baumes X Y A B C X Y A B C
Transformationen des AVL-Baumes - Teil1
Transformationen des AVL-Baumes - Teil 2