Arbres binaires de recherche

Arbre binaire de recherche (ABR)

On va maintenant utiliser des arbres binaires pour réaliser le tri d'un ensemble de données. On va considérer que l'on dispose d'une liste de nombres à trier. On va construire un arbre ayant certaine propriété ; une fois construit adéquatement, la liste des nombres triée sera obtenu en parcourant l'arbre.
Plus précisément, on va écrire une fonction qui ajoute un élément à un arbre, dans une nouvelle feuille de la manière suivante : soit v la valeur à ajouter, on commence le parcours à la racine de l'arbre déjà construit qui est désigné par l'expression « nœud courant » :
L'arbre ainsi construit est un arbre binaire de recherche (ABR).
On reprend la définition de la classe arbre binaire vue au TP précédent. Le fait que l'arbre soit un ABR n'est pas visible dans la définition de la classe. C'est par construction que c'est un ABR. Aussi, l'ajout d'une valeur dans l'arbre doit-il être réalisé pour garantir que l'on respecte bien la propriété des ABR.

Construction de l'arbre

On ajoute les lignes suivantes pour obtenir l'ABR à partir du fichier contenant 100 nombres :

f = open ("100.nombres", "r")
liste = f.readlines()
abr = construitABR (liste)
f.close ()

Parcours de l'ABR

Une fois construit, on parcourt l'arbre en commençant à la racine et en effectuant le traitement récursif suivant en chaque nœud :

Avec ces 4 fichiers de données, on obtient les ABR suivant :

Quelques questions de plus sur les ABR

Quelques méthodes d'instance à implanter :

Question à résoudre sur le papier, sans utiliser l'ordinateur :

Parcours d'arbres en profondeur d'abord

Il existe différentes manières de parcourir un arbre binaire. 3 manières sont particulièrement utiles et faciles à programmer récursivement. Elles se distinguent par le moment où l'étiquette du nœud est parcourue : avant les fils, après les fils, entre fils gauche et fils droit.

À quel parcours correspond le parcours d'un ABR pour obtenir la liste des valeurs triée de manière croissante ?

Égalité de deux ABR

On veut tester si deux ABR sont égaux. Cette égalité de deux ABR peut avoir plusieurs sens :

  1. les deux ABRs contiennent la même liste d'étiquettes.
  2. les deux ABRs ont exactement la même structure et les mêmes étiquettes dans les nœuds correspondant.

Écrire une méthode egal (self, o) qui détermine si les deux arbres ont la même structure (sens 2 ci-dessus).

On utilisera la méthode isinstance (o, Arbre) qui renvoie True si l'object o est une instance de la classe Arbre, ou False sinon.
Note : isinstance (...) doit être utilisé systématiquement pour tester la classe des objets passés en paramètre pour être certain que les opérations qui sont faites dans la méthode sont légitimes.

Écrire une méthode memeContenu (self, o) qui détermine si les deux arbres contiennent les mêmes étiquettes (sens 1 ci-dessus).

Encore quelques questions sur les ABR

Parcours d'un arbre en largeur d'abord

On veut parcourir l'ABR par niveau. Par exemple, pour cet ABR

les nœuds sont parcourus dans l'ordre suivant : 10, 5, 20, 1, 7, 18, 23, 6, 9, 21.

Écrire une méthode d'instance qui produit ce parcours.
(Aide : n'essayez pas de le faire de manière récursive.)