Suppression de l'arbre binaire de recherche
- Opération de suppression sur l’arbre binaire de recherche
- Illustration de suppression d’arbre binaire de recherche
- Algorithme de suppression BST
- arbre binaire de recherche Supprimer l’implémentation
- arbre binaire de recherche Supprimer la complexité de l’algorithme
Dans l’article [arbre binaire de recherche : rechercher et insérer](/fr/tutorial/data-structure/binary-search-tree/, nous avons expliqué comment insérer un élément dans un BST et comment rechercher une valeur dans un BST. Dans cet article, nous allons examiner comment supprimer un nœud de l’arbre binaire de recherche.
Opération de suppression sur l’arbre binaire de recherche
L’insertion d’un nœud dans la BST est relativement simple. Mais, tout en supprimant un nœud, nous devons tenir compte de multiples possibilités. Les 3 cas suivants peuvent se présenter :
-
Le nœud à supprimer n’a pas d’enfant - c’est une feuille.
C’est le cas le plus simple ; comme le nœud d’une feuille n’a pas d’enfant, nous n’avons pas à nous occuper de quoi que ce soit. Nous pouvons remplacer le nœud feuille par NULL
et libérer l’espace alloué à ce nœud.
-
Le nœud à supprimer n’a qu’un seul enfant (enfant gauche ou droit).
Dans ce cas, nous stockons l’enfant du nœud et nous retirons le nœud de sa position initiale. Le nœud enfant est alors inséré à la position d’origine du nœud supprimé.
-
Le nœud à supprimer a deux enfants, un enfant gauche et un enfant droit.
C’est le cas le plus délicat car ici, on ne peut pas simplement supprimer ou remplacer le nœud par son enfant. Dans ce cas, nous trouvons le plus petit nœud dans le sous-arbre droit du nœud minnode
. Remplacez la valeur du nœud à supprimer par la valeur de minnode
et appelez récursivement delete sur ce nœud.
Illustration de suppression d’arbre binaire de recherche
-
Le nœud à supprimer n’a pas d’enfant - c’est une feuille.
Le nœud7
n’a pas d’enfant; supprimez-le simplement de l’arborescence, aucune propriété BST n’est violée. -
Le nœud à supprimer n’a qu’un seul enfant
Le nœud15
a un enfant7
; nous devons nous en occuper avant de supprimer15
. Donc, nous le copions d’abord, puis nous le remplaçons par15
. -
Le nœud à supprimer a les deux enfants.
Le nœud 21 a deux enfants - 15 et 27. Nous trouvons le plus petit élément dans le sous-arbre de droite23
et le remplaçons par21
, puis nous appelons la récursion pour supprimer23
du sous-arbre de droite.
Algorithme de suppression BST
-
Si
root
==NULL
, alors renvoieNULL
. -
Si
root->key
<X
, alors écartez le sous-arbre de gauche et trouvez l’élément à supprimer dans le sous-arbre de droiteroot->right
=deleteNode(root->right,X)
-
Sinon, si
root->key
>X
, il faut supprimer le sous-arbre de droite et trouver l’élément à supprimer dans le sous-arbre de gaucheroot->left
=deleteNode(root->left, X)
-
Sinon si
root->key
==X
, alors agissez selon les 3 cas:- Si (
root->left
==NULL
&&root->right
==NULL
) alors supprimezroot
et renvoyezNULL
. - Sinon si (
root->right
==NULL
) alors copiez le sous-arbre de gauche et remplacez-le par le nœud à supprimer. - Sinon si (
root->left
==NULL
) alors copiez le sous-arbre de droite et remplacez-le par le nœud à supprimer. - Sinon si (
root->left
&&root->right
) alors trouvez le nœud minimum dans le sous-arbre droitminnode
et remplacez-le par le nœud à supprimer. Supprimez récursivementminnode
du sous-arbre de droite.
- Si (
-
Retournez le pointeur vers la racine d’origine.
arbre binaire de recherche Supprimer l’implémentation
#include <iostream>
using namespace std;
class Node {
public:
int key;
Node *left, *right;
};
Node* newNode(int item) {
Node* temp = new 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);
}
}
void insert(Node*& root, int key) {
Node* toinsert = newNode(key);
Node* curr = root;
Node* prev = NULL;
while (curr != NULL) {
prev = curr;
if (key < curr->key)
curr = curr->left;
else
curr = curr->right;
}
if (prev == NULL) {
prev = toinsert;
root = prev;
}
else if (key < prev->key) {
prev->left = toinsert;
}
else {
prev->right = toinsert;
}
}
Node* getmin(Node* root) {
Node* curr = root;
while (curr && curr->left) {
curr = curr->left;
}
return curr;
}
Node* deleteNode(Node* root, int key) {
if (root == NULL) return root;
if (key < root->key)
root->left = deleteNode(root->left, key);
else if (key > root->key)
root->right = deleteNode(root->right, key);
else {
if (root->left == NULL) {
Node* temp = root->right;
delete (root);
return temp;
} else if (root->right == NULL) {
Node* temp = root->left;
delete (root);
return temp;
}
Node* temp = getmin(root->right);
root->key = temp->key;
root->right = deleteNode(root->right, temp->key);
}
return root;
}
int main() {
Node* root = NULL;
insert(root, 5);
insert(root, 3);
insert(root, 8);
insert(root, 6);
insert(root, 4);
insert(root, 2);
insert(root, 1);
insert(root, 7);
inorder(root);
cout << "\n";
deleteNode(root, 5);
inorder(root);
}
arbre binaire de recherche Supprimer la complexité de l’algorithme
Complexité du temps
- Cas moyen
En moyenne, la complexité temporelle de la suppression d’un nœud d’une BST est de l’ordre de la hauteur de l’arbre binaire de recherche. En moyenne, la hauteur d’une BST est de O(logn)
. Elle se produit lorsque la BST formée est une BST équilibrée. Par conséquent, la complexité temporelle est de l’ordre de [Big Theta] : O(logn)
.
- Meilleur cas
Le meilleur cas se produit lorsque l’arbre est une BST équilibrée. Dans le meilleur des cas, la complexité temporelle de la suppression est de l’ordre de O(logn)
. C’est la même chose que la complexité temporelle du cas moyen.
- Pire cas
Dans le pire des cas, nous pourrions avoir à traverser de la racine au nœud le plus profond de la feuille, c’est-à-dire toute la hauteur h
de l’arbre. Si l’arbre est déséquilibré, c’est-à-dire s’il est de travers, la hauteur de l’arbre peut devenir n
, et par conséquent la complexité temporelle dans le pire des cas de l’opération d’insertion et de recherche est O(n)
.
Complexité spatiale
La complexité spatiale de l’algorithme est O(n)
en raison de l’espace supplémentaire requis par les appels de récursion.
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.
LinkedInArticle connexe - Data Structure
- Arbre binaire de recherche
- Convertir l'arbre binaire en arbre binaire de recherche
- Insertion itérative de l'arbre binaire de recherche
- Successeur de l'arbre de recherche binaire
- Traversée de l'arbre binaire
Article connexe - Binary Tree
- Arbre binaire de recherche
- Convertir l'arbre binaire en arbre binaire de recherche
- Insertion itérative de l'arbre binaire de recherche
- Successeur de l'arbre de recherche binaire
- Traversée de l'arbre binaire