TP1 - Création d'arbres binaires
- Comprendre la structure des arbres binaires ;
- Manipuler des classes ;
- Implémenter des parcours d'arbres.
Suivre le cours sur les arbres.
- Créer un dossier
Arbres - Créer un fichier
Classes_Arbre
Pour chaque fonction créée, ne pas oublier de la documenter.
Le but de cette première partie est de modéliser un arbre binaire en Python à l’aide de la programmation orientée objet.
Nous allons construire progressivement une classe représentant un nœud binaire, puis implémenter différentes méthodes permettant d’obtenir des informations sur l’arbre et de le parcourir.
Création de la classe NoeudBinaire
On souhaite définir une classe NoeudBinaire qui servira de base à la construction de nos arbres.
Un nœud binaire est caractérisé par :
- une valeur stockée dans le nœud ;
- un fils gauche, qui est soit un autre
NoeudBinaire, soitNone; - un fils droit, qui est soit un autre
NoeudBinaire, soitNone.
Un arbre binaire est une structure récursive :
- chaque fils est lui-même un arbre binaire ;
- l’arbre est entièrement représenté par son nœud racine.
- 1Créer la classe
NoeudBinairepuis implémenter son constructeur__init__prenant dans l’ordre :- la valeur du nœud (
valeur), - le fils gauche (
fils_gauche), - le fils droit (
fils_droite).
- la valeur du nœud (
Pour faciliter les tests, une fonction afficher_arbre(arbre) est téléchargeable ici.
-
Placer le fichier
afficheur_arbre.pydans le même dossier que votre fichier Python. -
Importer la fonction en début de fichier :
from afficheur_arbre import afficher_arbre
- 2Créer l'arbre suivant : et stocker la racine dans une variable nommée
arbre_binaire.
Méthodes de classe
Taille d'un arbre
La taille d’un arbre binaire correspond au nombre total de nœuds.
- 3Donner la taille de l’arbre
arbre_binaire.
Pour calculer la taille d’un arbre à partir de sa racine :
- Compter le nœud courant (1).
- Ajouter la taille du sous-arbre gauche s’il existe.
- Ajouter la taille du sous-arbre droit s’il existe.
- 4Implémenter la méthode
taille(self)dans la classeNoeudBinairequi retourne la taille de l’arbre. - 5Tester la méthode
taillesur l’arbrearbre_binaire.
Hauteur d’un arbre
La hauteur d’un arbre correspond à la profondeur maximale, c’est-à-dire la distance entre la racine et la feuille la plus éloignée.
- 6Donner la hauteur de l’arbre
arbre_binaire.
- Calculer la hauteur du sous-arbre gauche s'il existe.
- Calculer la hauteur du sous-arbre droit s'il existe. -. Retourner 1 + le maximum des hauteurs des deux sous-arbres.
- 7Implémenter la méthode
hauteur(self)dans la classeNoeudBinairequi retourne la hauteur de l’arbre. - 8Tester la méthode
hauteursur l’arbrearbre_binaire.
Feuilles d’un arbre
Une feuille est un nœud qui ne possède aucun fils.
- 9Donner le nombre de feuilles de l’arbre
arbre_binaire. - 10Implémenter la méthode
est_feuille(self)qui retourneTruesi le nœud est une feuille,Falsesinon.
- Si le noeud courant n’a pas de fils → c’est une feuille, on retourne 1.
- Si le noeud courant a un fils gauche → on calcule le nombre de feuilles du sous-arbre gauche.
- Si le noeud courant a un fils droit → on calcule le nombre de feuilles du sous-arbre droit.
- On retourne la somme du nombre de feuilles des sous-arbres gauche et droit.
- 11Implémenter la méthode
nombre_feuilles(self)qui retourne le nombre de feuilles de l’arbre. - 12Tester les méthodes
est_feuilleetnombre_feuillessur l’arbrearbre_binaire.
Parcours des arbres binaires
Le parcours d’un arbre correspond à un ordre de visite des nœuds à partir de la racine.
Nous allons implémenter quatre types de parcours :
- parcours préfixe ;
- parcours suffixe ;
- parcours infixe ;
- parcours en largeur.
Dans tous les parcours, l’affichage se fait avec print.
Parcours préfixe
Ordre : racine → gauche → droite
- 13Implémenter la méthode
parcours_prefixe(self)qui affiche les nœuds de l’arbre dans l’ordre préfixe. - 14Tester la méthode
parcours_prefixesur l’arbrearbre_binaire.
Parcours suffixe
Ordre : gauche → droite → racine
- 15Implémenter la méthode
parcours_suffixe(self)qui affiche les nœuds de l’arbre dans l’ordre suffixe. - 16Tester la méthode
parcours_suffixesur l’arbrearbre_binaire.
Parcours infixe
Ordre : gauche → racine → droite
- 17Implémenter la méthode
parcours_infixe(self)qui affiche les nœuds de l’arbre dans l’ordre infixe. - 18Tester la méthode
parcours_infixesur l’arbrearbre_binaire.
Parcours en largeur
Le parcours en largeur visite les nœuds niveau par niveau.
Ce parcours utilise une file (FIFO).
Principe :
- Mettre la racine dans la file.
- Tant que la file n’est pas vide :
- retirer un nœud et l’afficher ;
- ajouter ses fils dans la file.
- 19Importer la classe
File(du TP précédent). - 20Implémenter la méthode
parcours_largeur(self)qui affiche les nœuds de l’arbre dans l’ordre du parcours en largeur. - 21Tester la méthode
parcours_largeursur l’arbrearbre_binaire.