Suppression d'un élément dans un arbre binaire de recherche
La suppression d'un élément dans un arbre binaire de recherche est un peu plus complexe que les étapes précédentes car nous devons traiter différents cas selon le type de nœud :
- Si le nœud n'a aucun enfant (un nœud feuille), supprimez-le simplement.
- Si le nœud a un seul enfant, remplacez-le par son seul enfant.
- Si le nœud a deux enfants, remplacez-le par la valeur minimale du sous-arbre droit ou la valeur maximale du sous-arbre gauche.
public static BSTNode delete(int value, BSTNode current) {
if (current == null)
return current;
if (value < current.value)
current.leftChild = delete(value, current.leftChild);
else if (value > current.value)
current.rightChild = delete(value, current.rightChild);
else if (value == current.value) {
if (current.leftChild!= null && current.rightChild!= null) {
int min = current.rightChild.value;
BSTNode temp = current.rightChild;
while (temp.leftChild!= null) {
min = temp.leftChild.value;
temp = temp.leftChild;
}
current.value = min;
current.rightChild = delete(min, current.rightChild);
} else if (current.leftChild == null)
return current.rightChild;
else if (current.rightChild == null)
return current.leftChild;
}
return current;
}
Pour tester cette méthode, supprimez quelques nœuds et affichez l'arbre :
public static void main(String[] args) {
BSTNode root = new BSTNode(12);
root = insert(7, root);
root = insert(20, root);
root = insert(5, root);
root = insert(9, root);
root = insert(21, root);
// Supprimez quelques nœuds
root = delete(12, root);
root = delete(20, root);
root = delete(9, root);
// Affichez l'arbre pour vérifier la suppression
System.out.println("Parcours après suppression : ");
inorderTraversal(root);
}
Sortie :
Parcours après suppression :
5 7 21