TP - Arbres Binaires de Recherche☘
Ce TP doit conduire à créer de A à Z un module utilisable tout le reste de l'année.
Téléchargez le fichier « à trous » TAD_ABR.py (clic droit -> [Enregistrer la cible du lien sous]) et enregistrez-le dans le dossier intitulé [Mes_modules].
Remarque importante
La partie A va permettre d'implémenter une classe ArbreBinR
dont
l'interface sera celle d'un arbre binaire usuel, à laquelle on ajoute
l'insertion d'un élément.
La partie B va compléter cette implémentation par de nouvelles méthodes,
ce qui pourra permettre de modifier l'interface.
Partie A - Classe ArbreBinR
☘
Les objets de la classe ArbreBinR
sont munis de trois attributs : noeud
,
fg
et fd
initialisés à None
par défaut. Lors de l'initialisation d'un
arbre binaire de recherche, il ne doit pas être possible de spécifier
ses sous-arbres gauche et/ou droit.
Remarque
On a muni cette classe d'une méthode affichage()
déjà programmée qui
permet d'ores et déjà d'afficher l'arbre à l'aide du module turtle
.
Il ne faut surtout pas chercher à modifier cette méthode.
Complétez les méthodes de cette classe et vérifiez votre travail à l'aide du plan de test qui suit.
On définit un arbre « à la main » :
1 2 3 4 5 6 7 8 |
|
Puis on teste dans la console :
>>> arbre1
(5, (1, (), (2, (), ())), (6, (), (7, (), (8, (), ()))))
>>> arbre1.racine()
5
>>> arbre1.est_vide()
False
>>> arbre1.est_feuille()
False
>>> arbre1.fils_gauche()
(1, (), (2, (), ()))
>>> arbre1.fils_droit()
(6, (), (7, (), (8, (), ())))
False
>>> arbre1.fils_gauche().inserer(4)
>>> arbre1.fils_gauche()
(1, (), (2, (), (4, (), ())))
>>> arbre1.affichage()

Lorsque l'arbre est vide, on « initialise » cet arbre en donnant une valeur à sa racine (son nœud) et en initialisant les fils gauche et droite comme des arbres vides.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
|
Partie B - Interface améliorée☘
Dans cette partie, il va falloir reprogrammer une partie des fonctions déjà étudiées dans le premier TP sous une forme « orientée objet ».
Conseil général
N'oubliez pas de gérer le fait que les fils peuvent être vides...
-
Copiez, collez et complétez la définition de la méthode
insere_tab()
qui prend en paramètre un tableau d'éléments comparables et qui remplit l'arbre binaire de recherche de ces éléments.1 2 3 4 5 6
def insere_tab(self, tab): """ tab - list, tableau de valeurs de même type que les noeuds de l'arbre binaire de recherche Sortie: None - l'arbre dans lequel valeur a été insérée au bon endroit """
Plan de test
>>> arbre2 = ArbreBinR() >>> arbre2.insere_tab([11, 14, 12, 13, 7, 10, 5, 17]) >>> arbre2.affichage()
-
Définissez la méthode
mini()
qui renvoie la valeur du plus petit noeud de l'arbre (None
pour un arbre vide).Plan de test
>>> arbre1.mini() 1 >>> arbre2.mini() 5
-
Définissez la méthode
maxi()
qui renvoie la valeur du plus grand noeud de l'arbre (None
pour un arbre vide).Plan de test
>>> arbre1.maxi() 8 >>> arbre2.maxi() 17
-
Copiez, collez et complétez la définition de la méthode
recherche()
qui prend en paramètre un élément de même type que celui des nœuds de l'arbre et qui renvoieTrue
si cet élément est présent dans l'arbre,False
sinon.1 2 3 4 5
def recherche(self, valeur): """ valeur - élément de même type que les autres valeurs de l'ArbreBinR Sortie: bool - True si valeur est dans l'arbre, False sinon """
Plan de test
>>> arbre1.recherche(6) True >>> arbre2.recherche(6) False
-
Programmez les méthodes suivantes :
a.
parcours_largeur()
qui renvoie le tableau (éventuellement vide) des nœuds de l'arbre binaire de recherche parcourus en largeur ;
b.parcours_prefixe()
qui renvoie le tableau (éventuellement vide) des nœuds de l'arbre binaire de recherche parcourus en ordre préfixe ;
c.parcours_infixe()
qui renvoie le tableau (éventuellement vide) des nœuds de l'arbre binaire de recherche parcourus en ordre infixe ;
d.parcours_suffixe()
qui renvoie le tableau (éventuellement vide) des nœuds de l'arbre binaire de recherche parcourus en ordre suffixe ; -
Dans le «
main
», programmez la fonctiontri_ABR()
qui prend en paramètre un tableau d'éléments comparables et qui renvoie un tableau contenant les mêmes éléments mais triés dans l'ordre croissant.
Cette fonction doit utiliser un arbre binaire de recherche pour effectuer ce tri.1 2 3 4 5 6 7
def tri_ABR(tab): """ tab - list, tableau d'éléments comparables Sortie: list - tableau contenant les mêmes éléments mais triés dans l'ordre croissant en utilisant un arbre binaire de recherche intermédiaire. """
Plan de test
>>> tab = [5, 1, 6, 2, 7, 8, 4] >>> tri_ABR(tab) [1, 2, 4, 5, 6, 7, 8]