Binärer Suchbaum
- Suchoperationen im binären Suchbaum
- BST-Suchalgorithmus
- BST-Suche Abbildung
- Einfügen in BST
- BST-Einfügealgorithmus
- BST Insert Abbildung
- Implementierung von BST Search & Insert
- BST-Einfüge- und Suchalgorithmus Komplexität
Binary Search Tree (BST) ist eine geordnete knotenbasierte Binärbaum-Datenstruktur. Die Knoten haben einen Wert und zwei Kindknoten (Ein Binärbaum hat maximal zwei Kindknoten), die links und rechts an ihm hängen. Bis auf den Wurzelknoten können alle Knoten nur von ihrem Elternteil referenziert werden. Ein BST hat die folgenden Eigenschaften:
- Alle Knoten im linken Teilbaum sind kleiner als der Wurzelknoten.
- Alle Knoten im rechten Teilbaum sind größer als der Wurzelknoten.
- Der linke und der rechte Teilbaum müssen ebenfalls binäre Suchbäume sein.
Der Baum auf der linken Seite erfüllt alle Eigenschaften des BST. Andererseits scheint der Baum auf der rechten Seite ein BST zu sein, da alle Knoten im linken Teilbaum kleiner und im rechten Teilbaum größer sind. Aber der Knoten
1
im linken Teilbaum erfüllt die BST-Eigenschaften nicht, da er kleiner als der Knoten4
, aber nicht größer als der Wurzelknoten3
ist. Daher handelt es sich nicht um eine BST.
Da es sich um eine geordnete Datenstruktur handelt, sind die eingegebenen Elemente immer sortiert angeordnet. Wir können In-Order-Traversal verwenden, um die in der BST gespeicherten Daten in sortierter Reihenfolge abzurufen. Sie hat ihren Namen, weil sie, genau wie die binäre Suche, zum Durchsuchen der Daten in O(logn)
verwendet werden kann.
Suchoperationen im binären Suchbaum
Wir wissen, dass in einem BST alle Elemente auf der rechten Seite der Wurzel größer sind. Wenn also das gesuchte Zielelement kleiner als die Wurzel ist, kann der gesamte rechte Teilbaum vernachlässigt werden. Analog dazu kann der linke Teilbaum vernachlässigt werden, wenn das Element größer als die Wurzel ist. Wir bewegen uns auf ähnliche Weise, bis wir den Baum erschöpfen oder das Zielelement als Wurzel des Teilbaums finden. Wenn der BST balanciert ist (Ein Baum wird als balanciert bezeichnet, wenn für alle Knoten die Differenz zwischen der Höhe des linken und des rechten Teilbaums kleiner als gleich 1 ist.), dann verläuft die Suche innerhalb des BST ähnlich wie die binäre Suche, da beide Teilbäume etwa die Hälfte der Elemente haben, die bei jeder Iteration vernachlässigt werden.
BST-Suchalgorithmus
Sei root
der Wurzelknoten von BST und X
das zu suchende Zielelement.
-
Wenn
root
==NULL
, wirdNULL
zurückgegeben; -
Wenn
X
==root->data
, gibroot
zurück; -
Wenn
X
<root->data
, gibsearch(root->left)
zurück -
Wenn
X
>root->data
, gibSuche(root->right)
zurück
BST-Suche Abbildung
Angenommen, wir haben die obige BST und wollen das Element X
= 25
finden.
-
Vergleichen Sie das Wurzelelement mit
X
und finden Sie, dass41
>25
ist, also verwerfen Sie die rechte Hälfte und verschieben Sie zum linken Teilbaum. -
Die Wurzel des linken Teilbaums
23
<25
, also verwerfen Sie den linken Teilbaum und verschieben Sie ihn nach rechts. -
Die neue Wurzel
28
<25
, also nach links verschieben und unser ElementX
gleich25
finden und den Knoten zurückgeben.
Einfügen in BST
Der Algorithmus zum Einfügen eines Elements in BST ist dem Suchen eines Elements in BST sehr ähnlich, da wir vor dem Einfügen eines Elements dessen korrekte Position finden müssen. Der einzige Unterschied zwischen der Einfüge- und der Suchfunktion besteht darin, dass wir im Falle der Suche den Knoten zurückgeben, der den Zielwert enthält, während wir im Falle des Einfügens einen neuen Knoten an der entsprechenden Position des Knotens erstellen.
BST-Einfügealgorithmus
Sei root
der Wurzelknoten von BST und X
das Element, das wir einfügen wollen.
-
Wenn
root
==NULL
, wird ein neu gebildeter Knoten mitdata
=X
zurückgegeben -
wenn (
X
<root->data
),root->left
=insert(root->left, X)
; -
else if (
X
>root->data
) ,root->right
=insert(root->right, X)
; -
gibt einen Zeiger auf die ursprüngliche
root
zurück;
BST Insert Abbildung
-
Zuerst initialisieren wir BST, indem wir einen
root
-Knoten erzeugen und5
in diesen einfügen. -
3
ist kleiner als5
, also wird er links von5
eingefügt. -
4
ist kleiner als5
, aber größer als3
, also wird es rechts von3
, aber links von4
eingefügt. -
2
ist das kleinste Element im aktuellen Baum, also wird es an der äußersten linken Position eingefügt. -
1
ist das kleinste Element im aktuellen Baum, also wird es an der äußersten linken Position eingefügt. -
6
ist das größte Element im aktuellen Baum, also wird es an der äußersten rechten Position eingefügt.
Auf diese Weise fügen wir Elemente innerhalb einer BST ein.
Implementierung von BST Search & Insert
#include <iostream>
using namespace std;
class Node {
public:
int key;
Node *left, *right;
};
Node *newNode(int item) {
Node *temp = (Node *)malloc(sizeof(Node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
void inorder(Node *root) {
if (root != NULL) {
inorder(root->left);
cout << root->key << " ";
inorder(root->right);
}
}
Node *insert(Node *root, int key) {
if (root == NULL) return newNode(key);
if (key < root->key)
root->left = insert(root->left, key);
else
root->right = insert(root->right, key);
return root;
}
Node *search(Node *root, int key) {
if (root == NULL || root->key == key) return root;
if (root->key < key) return search(root->right, key);
return search(root->left, key);
}
int main() {
Node *root = NULL;
root = insert(root, 5);
root = insert(root, 3);
root = insert(root, 8);
root = insert(root, 6);
root = insert(root, 4);
root = insert(root, 2);
root = insert(root, 1);
root = insert(root, 7);
cout << search(root, 5)->key << endl;
}
BST-Einfüge- und Suchalgorithmus Komplexität
Zeitkomplexität
- Durchschnittlicher Fall
Im durchschnittlichen Fall ist die Zeitkomplexität des Einfügens eines Knotens oder der Suche nach einem Element in einer BST in der Größenordnung der Höhe des binären Suchbaums. Im Durchschnitt ist die Höhe eines BST O(logn)
. Sie tritt auf, wenn die gebildete BST eine balancierte BST ist. Daher ist die Zeitkomplexität in der Größenordnung von [Big Theta]: O(logn)
.
- Bester Fall
Der Best-Case tritt auf, wenn der Baum ein balanciertes BST ist. Die Best-Case-Zeitkomplexität des Einfügens und Suchens ist in der Größenordnung von O(logn)
. Sie ist identisch mit der Zeitkomplexität im mittleren Fall.
- Schlimmster Fall
Im schlimmsten Fall müssen wir von der Wurzel bis zum tiefsten Blattknoten, d. h. über die gesamte Höhe h
des Baums, gehen. Wenn der Baum unbalanciert ist, d. h. schief, kann die Höhe des Baums n
werden, und daher ist die Zeitkomplexität im schlimmsten Fall sowohl für die Einfüge- als auch für die Suchoperation O(n)
.
Raumkomplexität
Die Platzkomplexität sowohl der Einfüge- als auch der Suchoperationen ist O(n)
aufgrund des Platzbedarfs der rekursiven Aufrufe.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedInVerwandter Artikel - Data Structure
- Binärbaum in Binärsuchbaum konvertieren
- Binärbaum-Traversal
- Binärer Suchbaum Inorder Succesor
- Binärer Suchbaum Iteratives Einfügen
- Binärer Suchbaum löschen
Verwandter Artikel - Binary Tree
- Binärbaum in Binärsuchbaum konvertieren
- Binärbaum-Traversal
- Binärer Suchbaum Inorder Succesor
- Binärer Suchbaum Iteratives Einfügen
- Binärer Suchbaum löschen