In der Informatik ist ein binärer Suchbaum eine spezielle Implementierung der abstrakten Datenstruktur Suchbaum. Ein binärer Suchbaum ist ein binärer Baum, bei dem die Knoten des linken Teilbaums eines Knotens nur kleinere Werte und die Knoten des rechten Teilbaums eines Knotens nur größere Werte als der Knoten selbst besitzen.
Binäre Suchbäume sind in der Regel effizienter als lineare Datenstrukturen wie verkettete Listen, da man in ihnen schneller suchen und Elemente einfügen kann. Jedoch können sie zu einer verketteten Liste entarten; deshalb wurden verbesserte Varianten wie z.B. AVL-Bäume entwickelt.
Führt man bei einem binären Suchbaum einen InOrder-Durchlauf aus, so erhält man eine sortierte Liste der Einträge.
Die Suche nach einem Eintrag verläuft derart, dass zunächst der Wert der Wurzel mit dem Suchschlüssel verglichen wird. Sind beide gleich, so ist der Eintrag gefunden.
Andernfalls wird überprüft, ob der Suchschlüssel kleiner ist als der Knotenwert: dann wird die Suche rekursiv im linken Teilbaum der Wurzel fortgeführt; gibt es keinen linken Teilbaum, so existiert der gesuchte Eintrag im binären Baum nicht.
Ist der Suchschlüssel größer, so wird entsprechend im rechten Teilbaum weitergesucht.
Der folgende Pseudocode illustriert die Arbeitsweise des Algorithmus: x: Wurzel des Suchbaums s: gesuchter Schlüssel suche(x, s) 1 wenn x = null oder s = schlüssel* 2 dann ergebnis: x 3 wenn s < schlüssel* 4 dann ergebnis: suche(wurzel_linker_teilbaum*, s) 5 sonst ergebnis: suche(wurzel_rechter_teilbaum*, s)
Die Höhe h ist für den Worst Case immer genauso groß wie die Anzahl der vorhanden Elemente n, damit muss jedes einzufügende Element n, n-1 Elemente durchlaufen. Dies jedoch für alle einzufügenden Elemente. Damit erhält man die Aufsummierung aller Zahlen kleiner n:
Der Best Case ist jedoch schon wesentlich schöner. Geht man von mit d als Tiefe/Höhe und c als Anzahl der im Baum enthaltenen Elemente aus, so erhält man folgende Komplexitätsrechnung.
Vollständig gefüllte binäre Suchbäume sowie balancierte Suchbäume haben eine Höhe von O(log n) und ermöglichen so die Suche in logarithmischer Laufzeit. Dies gilt sogar im Durchschnitt für zufällig erzeugte Suchbäume, wenn die folgenden Bedingungen erfüllt sind:
Durch häufige Anwendung der Löschoperation wird ein binärer Suchbaum jedoch linkslastig, so dass sich das Laufzeitverhalten beim häufigem Löschen verschlechtert.
Siehe auch: O-Notation
Das Einfügen funktioniert nach dem gleichen Prinzip wie das Suchen. Dabei endet die Suche nach dem einzufügenden Element an einem Knoten u.U. erfolglos. Man lässt nun einfach diesen Knoten auf das neue Element verweisen, damit ist dieses korrekt eingefügt. Die Komplexität der Einfügeoperation entspricht somit der Komplexität der Suchoperation.
Nach dem Einfügen ist das neue Element ein Blatt des Suchbaums.
Im folgenden Beispiel wird ein Knoten mit dem Wert 'J' in einen binären Suchbaum eingefügt.
S S / \ / \ / \ / \ G W G W / \ / \ / \ => / \ D M D M / \ \ / \ / \ / \ \ / \ / \ B F P B F J P
Das Löschen ist trivial, wenn der zu löschende Knoten ein Blatt ist: dann wird er einfach entfernt.
Auch wenn der zu löschende Knoten nur einen Nachfolger hat, ist das Löschen recht einfach: der Nachfolger wird an die Stelle gesetzt, an der der zu löschende Knoten war.
Hat der zu löschende Knoten zwei Nachfolger, so ist die eine Möglichkeit, den linken Teilbaum an die Position zu setzen, an der der zu löschende Knoten war, und den rechten Teilbaum rechts an den linken anzuhängen, wie es das Beispiel zeigt:
S S / \ / \ / \ / \ G W D W / \ / \ / \ => / \ D M B F / \ / \ \ / \ / \ \ B F J P M / \ / \ J P
Eine andere Möglichkeit wäre, im rechten Teilbaum nach dem kleinsten Wert zu suchen. Dies ist bei einem Binären Suchbaum der Knoten der im Teilbaum am weitesten links steht. Dieser ersetzt dann den zu löschenden Knoten. Der Knoten J würde also den Knoten G ersetzen.
Durch wiederholtes Löschen kommt es dazu, dass der Baum nicht mehr balanciert ist, sondern zu einer linearen Liste entartet.
Die Komplexität der Löschoperation ist ebenfalls O(h), wobei h die Höhe des Baumes ist.
Eine andere Möglichkeit, bei der der Baum nicht so stark entartet, ist, den InOrder-Nachfolger an die Stelle des gelöschten Elements zu setzen.
Alternativ kann man auch den größten Wert im linken Teilbaum (relativ zu dem zu löschenden Element) oder den kleinsten Wert im rechten Teilbaum an die Stelle des zu löschenden Elements setzen.
Rotationen werden benötigt, um die Bedingungen von balancierten Bäumen (bspw. Rot-Schwarz-Bäumen) wieder herzustellen.
W S / \ Right-Rotate(T,W) / \ / \
Erklärung zu Right-Rotate(T,W):
W mit rechtem Teilbaum wird zum rechten Teilbaum von S. Der ursprüngliche rechte Teilbaum U von S wird zum linken Teilbaum von W. Der rechte Teilbaum Y von W bleibt an seiner Position.
Erklärung zu Left-Rotate(T,S):
S mit linkem Teilbaum wird zum linken Teilbaum von W. Der ursprüngliche linke Teilbaum U von W wird zum rechten Teilbaum von S. Der rechte Teilbaum Y von W bleibt an seiner Position.
Rotationen verletzen die Suchbaum-Eigenschaften nicht, also ist nach ihrer Anwendung ein korrekter Suchbaum vorhanden.
Rotationen benötigen konstante Laufzeit O(1).
Binært søgetræ | Binary search tree | Árbol binario de búsqueda | Binäärinen hakupuu | Arbre binaire de recherche | עץ חיפוש | Albero binario di ricerca | 2分探索木 | Zoekboom | Drzewo poszukiwań binarnych | Árvore de busca binária | Двоичное дерево поиска | Бінарне дерево пошуку | 二元搜尋樹
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Binärer Suchbaum".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world