Arbres binaires de recherche
Définition
Un arbre binaire de recherche (ABR) (binary search tree – BST) est un arbre binaire tel que :
- les clefs des nœuds doivent être ordonnables (il doit exister entre elles une relation d’ordre)
- pour chacun de ses nœuds:
- chaque nœud du sous-arbre gauche a une clé inférieure (ou égale) à celle du nœud considéré,
- chaque nœud du sous-arbre droit possède une clé supérieure (ou égale) à celle-ci
Remarque : selon la mise en œuvre de l’ABR, on pourra interdire ou non des clés de valeurs égales.
Lorsqu’on ajoute un nœud à un ABR, il devient une feuille de l’arbre.
Définitions spécifiques
Arbre binaire parfait : arbre dont tous les niveaux sont remplis et dont toutes les feuilles sont à la même profondeur (le dernier niveau est complètement occupé).
Arbre binaire complet : tous les niveaux de l’arbre sont remplis, sauf éventuellement le dernier, sur lequel les nœuds (feuilles) sont à gauche.
Arbre binaire équilibré : tous les chemins de la racine aux feuilles ont la même longueur.
Arbre binaire dégénéré : chacun de ses nœuds a au plus un fils.
Interface
Soit l’ABR suivant, qui servira comme support pour illustrer la suite :
Plus petite (grande) valeur
Pour accéder à la clé la plus petite dans un ABR, il suffit de descendre sur le fils gauche autant que possible. Le dernier nœud visité qui n’a pas de fils gauche porte la valeur la plus petite de l’arbre.
Tri des clés
Pour obtenir la suite ordonnée de toutes les clés d’un ABR, il suffit de le parcourir l’arbre dans l’ordre infixe.
Exemple :
Recherche
Comme son nom l’indique, un ABR est spécifiquement adapté à la recherche d’enregistrements dont les clés sont données par les nœuds de l’arbre.
Exemple : recherche de la clé de valeur 6
Un ABR permet de rechercher rapidement (faible coût temporel).
Insertion
Pour insérer un nœud dans un arbre :
- on recherche le nœud dont la clé est la plus proche de celle du nœud à insérer
(comme pour l’algorithme de recherche, sauf que le nœud recherché n’est pas sensé être trouvé), - dès qu’une place est libre, on ajoute le nœud :
- à gauche si sa clé est inférieure à celle de la feuille,
- ou à droite dans le cas contraire.
Exemple : ajout d’un nœud dont la clé vaut 5 :
Dans le cas d’un ABR qui n’autorise pas les clés multiples, il faudra empêcher l’insertion d’un nœud dont la clé est déjà dans l’arbre.
Suppression
L’opération dépend du nombre de fils du nœud à supprimer.
Cas n°1 : le nœud à supprimer est une feuille
- On cherche le père du nœud à supprimer,
- On supprimer le lien père-fils.
Exemple : suppression du nœud 5
Cas n°2 : le nœud à supprimer a un unique fils
- On recherche le père du nœud à supprimer,
- On redirige le lien père-fils vers le fils (unique) du nœud à supprimer.
Exemple : suppression du nœud 6
Cas n°3 : le nœud à supprimer a deux fils
- On recherche le nœud de sa branche de gauche ayant la plus grande valeur,
comme c’est le plus grand de cette branche, il n’a pas de fils droit (voir Plus grande valeur) - On redirige son lien père-fils (comme dans le cas n°2 ! ),
- Et on remplace la valeur du nœud à supprimer par celle du nœud décroché.
Exemple : suppression du nœud 11
Exemple : suppression du nœud 7
Remarque : alternativement, on peut « décrocher » le nœud ayant la plus petite valeur de sa branche de droite.
Implémentation
On se propose d’implémenter l’interface présentée plus haut en langage Python.
Pour cela, on utilisera, comme des modules (sans les modifier !), les programmes suivant :
ABR
(Arbre Binaire de Recherche), héritant de la classe Arbre_b
(Arbre Binaire).
ABR
, les opérations de l’interface évoquée plus haut :min()
→Noeud_b
max()
→Noeud_b
chercher(v)
→Noeud_b
inserer(v)
supprimer(v)
verifier()
→bool
(méthode récursive, d’après la définition d’un ABR)
Sources :
https://fr.wikipedia.org/wiki/Arbre_binaire_de_recherche
http://pageperso.lif.univ-mrs.fr/~francois.denis/algoMPCI/chap1.pdf