Ein Baum (Tree) ist eine hierarchische Datenstruktur, die aus Knoten und Kanten besteht. Grundbegriffe:
Ein binärer Baum ist ein Baum, bei dem jeder Knoten höchstens zwei Kinder hat: ein linkes Kind und ein rechtes Kind.
class BaumKnoten<T> {
T daten;
BaumKnoten<T> links;
BaumKnoten<T> rechts;
BaumKnoten(T daten) {
this.daten = daten;
}
}Ein binärer Suchbaum (Binary Search Tree, BST) ist ein binärer Baum mit der Suchbaumeigenschaft:
Beispiel: Ein BST mit den Werten 5, 3, 7, 1, 4, 6, 8:
5
/ \
3 7
/ \ / \
1 4 6 8Die Suche nutzt die Suchbaumeigenschaft und arbeitet ähnlich wie die binäre Suche:
algorithmus suche(knoten, wert):
wenn knoten == null:
gib NICHT GEFUNDEN zurück
wenn wert == knoten.daten:
gib knoten zurück
wenn wert < knoten.daten:
gib suche(knoten.links, wert) zurück
sonst:
gib suche(knoten.rechts, wert) zurückLaufzeit: O(h) mit h = Höhe des Baumes. Bei einem balancierten BST: O(log n). Im Worst Case (entarteter Baum = „Liste“): O(n).
algorithmus einfuegen(knoten, wert):
wenn knoten == null:
gib neuen Knoten(wert) zurück
wenn wert < knoten.daten:
knoten.links = einfuegen(knoten.links, wert)
sonst wenn wert > knoten.daten:
knoten.rechts = einfuegen(knoten.rechts, wert)
gib knoten zurückNeue Elemente werden immer als Blatt eingefügt. Die Laufzeit ist ebenfalls O(h).
Es gibt drei klassische Methoden, einen binären Baum rekursiv zu durchlaufen:
Beispiel für den Baum oben (5,3,7,1,4,6,8):
algorithmus inorder(knoten):
wenn knoten != null:
inorder(knoten.links)
ausgabe(knoten.daten)
inorder(knoten.rechts)
algorithmus preorder(knoten):
wenn knoten != null:
ausgabe(knoten.daten)
preorder(knoten.links)
preorder(knoten.rechts)
algorithmus postorder(knoten):
wenn knoten != null:
postorder(knoten.links)
postorder(knoten.rechts)
ausgabe(knoten.daten)Wenn Elemente in sortierter Reihenfolge eingefügt werden, entartet der BST zu einer linearen Liste. Die Höhe wird n und alle Operationen degenerieren zu O(n).
Balancierte Bäume (z. B. AVL-Baum, Rot-Schwarz-Baum) garantieren eine Höhe von O(log n) durch automatische Umstrukturierung (Rotationen) nach dem Einfügen oder Löschen.
Abitur-Tipp: Präge dir die drei Traversierungsarten und ihre Merkwörter ein: Inorder = LWR (Links, Wurzel, Rechts → sortiert), Preorder = WLR (Wurzel zuerst), Postorder = LRW (Wurzel zuletzt). Typische Aufgabe: Gegeben ein BST, gib die Inorder-Traversierung an. Oder: Füge Elemente in einen leeren BST ein und zeichne den resultierenden Baum. Beachte, dass die Einfügereihenfolge die Baumstruktur bestimmt!
Ein binärer Suchbaum, bei dem für jeden Knoten gilt: Alle Werte im linken Teilbaum sind kleiner, alle im rechten größer.