Binärbaum
aus Wikipedia, der freien Enzyklopädie
Als Binärbaum bezeichnet man in der Graphentheorie eine spezielle Form eines Graphen. Genauer gesagt handelt es sich um einen gewurzelten Baum, bei dem jeder Knoten höchstens zwei Kindknoten besitzt. Oft wird verlangt, dass sich die Kindknoten eindeutig in linkes und rechtes Kind einteilen lassen.
Eine verbale Definition: Ein Binärbaum ist entweder leer, oder er besteht aus einem linken und/oder rechten Teilbaum, die wiederum Binärbäume sind!
Inhaltsverzeichnis |
[Bearbeiten] Weitere Begriffe
Ein Binärbaum heißt geordnet, wenn jeder innere Knoten ein linkes und eventuell zusätzlich ein rechtes Kind besitzt (und nicht etwa nur ein rechtes Kind). Man bezeichnet ihn als voll oder strikt, wenn jeder Knoten entweder Blatt ist (also kein Kind besitzt), oder aber zwei (also sowohl ein linkes wie ein rechtes) Kinder besitzt. Man bezeichnet ihn als vollständig, wenn alle Blätter die gleiche Tiefe (Anzahl übergeordneter Knoten) besitzen. Induktiv lässt sich zeigen, dass ein vollständiger Binärbaum der Höhe n, den man häufig auch als Bn bezeichnet, genau
besitzt, wobei mit Höhe n die Länge des Pfades zu einem tiefsten Knoten bezeichnet wird. Eine Darstellung eines Binärbaumes, in dem die Knoten mit rechtwinkligen Dreiecken und die Kanten mit Rechtecken dargestellt werden, nennt man pythagoreischen Binärbaum.
[Bearbeiten] Anwendungen
Viele Datenstrukturen wie beispielsweise binäre Suchbäume, AVL-Bäume, Fibonacci-Bäume und binäre Heaps basieren auf Binärbäumen.
[Bearbeiten] Einige spezielle Binärbäume
[Bearbeiten] Partiell geordneter Baum
Ein partiell geordneter Baum T ist ein spezieller Baum,
- dessen Knoten markiert sind
- dessen Markierungen aus einem geordneten Wertebereich stammen
- in dem für jeden Teilbaum T' mit der Wurzel x gilt: Alle Knoten aus T' sind größer markiert als x oder gleich x.
Intuitiv bedeutet dies: Die Wurzel jedes Teilbaumes stellt ein Minimum für diesen Teilbaum dar. Die Werte des Teilbaumes nehmen in Richtung der Blätter zu oder bleiben gleich.
Derartige Bäume werden häufig in Heaps verwendet.
[Bearbeiten] Vollständig balancierter Binärbaum
Ein vollständig balancierter Binärbaum ist ein voller Binärbaum, bei dem die Abstände zweier beliebiger Blätter von der Wurzel um höchstens 1 voneinander abweichen. (siehe auch Balancierter Baum oder AVL-Baum)
[Bearbeiten] Traversierung
Traversierung bezeichnet das Untersuchen der Knoten des Baumes in einer bestimmten Reihenfolge. Ein Spezialfall ist die Linearisierung, bei der die Elemente in der Reihenfolge der Traversierung in eine Liste eingefügt werden.
Es gibt verschiedene Möglichkeiten, die Knoten von Binärbäumen zu durchlaufen. Man unterscheidet hier in
- pre-order (W–L–R): wobei zuerst die Wurzel (W) betrachtet wird und anschließend zuerst der linke (L), dann der rechte (R) Teilbaum durchlaufen wird,
- in-order (L–W–R): wobei zuerst der linke (L) Teilbaum durchlaufen wird, dann die Wurzel (W) betrachtet wird und anschließend der rechte (R) Teilbaum durchlaufen wird und
- post-order (L–R–W): wobei zuerst der linke (L), dann der rechte (R) Teilbaum durchlaufen wird und anschließend die Wurzel (W) betrachtet wird.
- level-order Beginnend bei der Wurzel, werden die Ebenen von links nach rechts durchlaufen.
[Bearbeiten] Rekursive Implementierungen
Funktion Preorder(Baum) W <- Baum.Wurzel //W:= Wurzel des übergebenen Baumes If Baum.Links <> NULL //Existiert ein linker Unterbaum? L <- Preorder(Baum.Links) // dann: L:= Preorder von linkem Unterbaum If Baum.Rechts <> NULL //Existiert ein rechter Unterbaum? R <- Preorder(Baum.Rechts) // dann: R:= Preorder von rechtem Unterbaum Return W°L°R //Rückgabe: Verkettung aus W, L und R
Funktion Inorder(Baum) W <- Baum.Wurzel //W:= Wurzel des übergebenen Baumes If Baum.Links <> NULL //Existiert ein linker Unterbaum? L <- Inorder(Baum.Links) // dann: L:= Inorder von linkem Unterbaum If Baum.Rechts <> NULL //Existiert ein rechter Unterbaum? R <- Inorder(Baum.Rechts) // dann: R:= Inorder von rechtem Unterbaum Return L°W°R //Rückgabe: Verkettung aus L, W und R
Funktion Postorder(Baum) W <- Baum.Wurzel //W:= Wurzel des übergebenen Baumes If Baum.Links <> NULL //Existiert ein linker Unterbaum? L <- Postorder(Baum.Links) // dann: L:= Postorder von linkem Unterbaum If Baum.Rechts <> NULL //Existiert ein rechter Unterbaum? R <- Postorder(Baum.Rechts) // dann: R:= Postorder von rechtem Unterbaum Return L°R°W //Rückgabe: Verkettung aus L, R und W