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.
- Cré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
- Cré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.
- Donner 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.
- Implémenter la méthode
taille(self)dans la classeNoeudBinairequi retourne la taille de l’arbre. - Tester 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.
- Donner 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.
- Implémenter la méthode
hauteur(self)dans la classeNoeudBinairequi retourne la hauteur de l’arbre. - Tester la méthode
hauteursur l’arbrearbre_binaire.
Feuilles d’un arbre
Une feuille est un nœud qui ne possède aucun fils.
- Donner le nombre de feuilles de l’arbre
arbre_binaire. - Implé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.
- Implémenter la méthode
nombre_feuilles(self)qui retourne le nombre de feuilles de l’arbre. - Tester 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
- Implémenter la méthode
parcours_prefixe(self)qui affiche les nœuds de l’arbre dans l’ordre préfixe. - Tester la méthode
parcours_prefixesur l’arbrearbre_binaire.
Parcours suffixe
Ordre : gauche → droite → racine
- Implémenter la méthode
parcours_suffixe(self)qui affiche les nœuds de l’arbre dans l’ordre suffixe. - Tester la méthode
parcours_suffixesur l’arbrearbre_binaire.
Parcours infixe
Ordre : gauche → racine → droite
- Implémenter la méthode
parcours_infixe(self)qui affiche les nœuds de l’arbre dans l’ordre infixe. - Tester 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.
- Importer la classe
File(du TP précédent). - Implémenter la méthode
parcours_largeur(self)qui affiche les nœuds de l’arbre dans l’ordre du parcours en largeur. - Tester la méthode
parcours_largeursur l’arbrearbre_binaire.