TP - Parcours d'arbre binaire☘
Dans le dossier [NSI], créez le dossier [E02-Algo_Arbres].
Téléchargez le module TAD_ArbresBin.py qui contient une implémentation d'arbre binaire et placez ce module dans votre répertoire de travail.
L'interface est celle donnée dans le cours :
Méthode/Opérations | Description |
---|---|
A = ArbreBin(rac, fg, fd) |
Initialisation d'un arbre binaire de racine rac ,
de fils gauche et fils droit les arbres fg et
fd Ces trois paramètres sont initialisés à None par
défaut |
est_vide(A) |
Renvoie True si l'arbre est vide, False sinon. |
racine(A) |
Renvoie la valeur de la racine de l’arbre A si cette
racine existe, None sinon. |
fils_gauche(A) |
Renvoie le sous-arbre (fils) gauche de A si
ce sous-arbre existe, un arbre vide sinon. |
fils_droit(A) |
Renvoie le sous-arbre (fils) gauche de A si
ce sous-arbre existe, un arbre vide sinon. |
Attention
Cette interface n'est pas orientée objet, elle s'utilise de la même manière que dans les exemples du cours et dans le TD.
Affichage
Pour visualiser cet arbre, vous avez deux possibilités :
- La fonction
print()
réalise un affichage en ligne de l'arbre A passé en argument. - La fonction
affiche_arbreBin()
réalise un affichage en deux dimensions de l'arbre A passé en argument. Cet affichage est effectué à l'aide du moduleturtle
(merci à Q. CHAMUSSY, enseignant dans l'académie de Lyon, pour l'idée originale de cette fonction).
Ce TP a pour but de vous faire programmer les algorithmes de parcours
d'arbres binaires étudiés en cours.
Téléchargez le fichier « à trous » : TPE02.10.py
(clic droit -> [Enregistrer sous]) et enregistrez-le dans le répertoire de travail.
Partie A - Préparer les arbres de test☘
Afin de tester chacune des fonctions à programmer dans ce TP et vous
familiariser avec l'interface, programmez les trois arbres ci-dessous dans
le « main
» de votre programme.
Affichez chaque arbre afin de vérifier votre travail.
-
Arbre n°1
-
Arbre n°2
-
Arbre n°3
Partie B - Parcours en profondeur☘
-
Complétez la définition récursive de la fonction
parcours_infixe()
qui prend en paramètre un arbre binaire et une variabletab
initialisée àNone
. Cette fonction renvoie le tableautab
contenant les nœuds de l'arbre visités dans l'ordre infixe.1 2 3 4 5 6 7
def parcours_infixe(arbre, tab=None): """ arbre - ArbreBin, arbre binaire tab - list, tableau contenant des noeuds de l'arbre Sortie: list, tableau tab contenant les noeuds de l'arbre parcourus en ordre infixe (fils gauche, noeud, fils droit) """
Plan de test
>>> parcours_infixe(arbre1) ['H', 'R', 'U', 'A', 'T', 'S'] >>> parcours_infixe(arbre2) [41, 5, 3, 23, 37, 7, 2, 19, 11] >>> parcours_infixe(arbre3) ['K', 'G', 'E', 'I', 'Z', 'S', 'F', 'L', 'A', 'B', 'P', 'C']
Une piste
La variable
tab
est initialisée par défaut àNone
.
Il faut tester cette situation et « placer » alors un tableau vide dans cette variable. -
Complétez la définition récursive de la fonction
parcours_prefixe()
qui prend en paramètre un arbre binaire et une variabletab
initialisée àNone
. Cette fonction renvoie le tableautab
contenant les nœuds de l'arbre visités dans l'ordre préfixe.1 2 3 4 5 6 7
def parcours_prefixe(arbre, tab=None): """ arbre - ArbreBin, arbre binaire tab - list, tableau contenant des noeuds de l'arbre Sortie: list, tableau tab contenant les noeuds de l'arbre parcourus en ordre prefixe (noeud, fils gauche, fils droit) """
Plan de test
>>> parcours_prefixe(arbre1) ['A', 'R', 'H', 'U', 'T', 'S'] >>> parcours_prefixe(arbre2) [37, 41, 3, 5, 23, 2, 7, 11, 19] >>> parcours_prefixe(arbre3) ['Z', 'E', 'G', 'K', 'I', 'A', 'F', 'S', 'L', 'B', 'C', 'P']
Une piste
La variable
tab
est initialisée par défaut àNone
.
Il faut tester cette situation et « placer » alors un tableau vide dans cette variable. -
Complétez la définition récursive de la fonction
parcours_suffixe()
qui prend en paramètre un arbre binaire et une variabletab
initialisée àNone
. Cette fonction renvoie le tableautab
contenant les nœuds de l'arbre visités dans l'ordre suffixe.1 2 3 4 5 6 7
def parcours_suffixe(arbre, tab=None): """ arbre - ArbreBin, arbre binaire tab - list, tableau contenant des noeuds de l'arbre Sortie: list, tableau tab contenant les noeuds de l'arbre parcourus en ordre suffixe (fils gauche, fils droit, noeud) """
Plan de test
>>> parcours_suffixe(arbre1) ['H', 'U', 'R', 'S', 'T', 'A'] >>> parcours_suffixe(arbre2) [5, 23, 3, 41, 7, 19, 11, 2, 37] >>> parcours_suffixe(arbre3) ['K', 'G', 'I', 'E', 'S', 'L', 'F', 'P', 'C', 'B', 'A', 'Z']
Une piste
La variable
tab
est initialisée par défaut àNone
.
Il faut tester cette situation et « placer » alors un tableau vide dans cette variable.
Partie C - Parcours en largeur☘
Complétez la définition itérative de la fonction parcours_largeur()
qui
prend en paramètre un arbre binaire et qui renvoie un tableau contenant les
nœuds de l'arbre visités « en largeur ».
1 2 3 4 5 6 |
|
Plan de test
>>> parcours_largeur(arbre1)
['A', 'R', 'T', 'H', 'U', 'S']
>>> parcours_largeur(arbre2)
[37, 41, 2, 3, 7, 11, 5, 23, 19]
>>> parcours_largeur(arbre3)
['Z', 'E', 'A', 'G', 'I', 'F', 'B', 'K', 'S', 'L', 'C', 'P']
Une piste
Pour programmer ce parcours, vous avez besoin d'utiliser une file.
- Soit vous utilisez une structure de file programmée plus tôt dans l'année.
- Soit vous utilisez un tableau (liste Python) comme une file dont
le premier élément est l'élément d'indice
0
(défilé avec.pop(0)
) et le dernier élément est enfilé en fin de tableau (méthode.append()
).
Partie D - Parcours itératifs en profondeur☘
-
Complétez la définition itérative de la fonction
parcours_prefixe_iter()
qui prend en paramètre un arbre binaire et renvoie un tableau contenant les nœuds de l'arbre visités dans l'ordre préfixe.1 2 3 4 5 6 7
def parcours_prefixe_iter(arbre): """ arbre - ArbreBin, arbre binaire Sortie: list, tableau contenant les noeuds de l'arbre parcourus en ordre prefixe (noeud, fils gauche, fils droit) (méthode itérative) """
Plan de test
>>> parcours_prefixe_iter(arbre1) ['A', 'R', 'H', 'U', 'T', 'S'] >>> parcours_prefixe_iter(arbre2) [37, 41, 3, 5, 23, 2, 7, 11, 19] >>> parcours_prefixe_iter(arbre3) ['Z', 'E', 'G', 'K', 'I', 'A', 'F', 'S', 'L', 'B', 'C', 'P']
Une piste
Pour programmer ce parcours, vous avez besoin d'utiliser une pile.
- Soit vous utilisez une structure de pile programmée plus tôt dans l'année.
- Soit vous utilisez un tableau (liste Python) comme une pile dont
le dernier élément est le sommet de la pile (dépilé avec
.pop()
, empilé avec.append()
).
Un algorithme
- Placer l'arbre dans la pile.
- On dépile cet arbre, on place sa racine dans le tableau, on empile le sous-arbre droit puis le sous-arbre gauche (s'ils existent).
- On recommence jusqu'à ce que la pile soit vide...
-
Complétez la définition itérative de la fonction
parcours_suffixe_iter()
qui prend en paramètre un arbre binaire et renvoie un tableau contenant les nœuds de l'arbre visités dans l'ordre suffixe.1 2 3 4 5 6 7
def parcours_suffixe_iter(arbre): """ arbre - ArbreBin, arbre binaire Sortie: list, tableau contenant les noeuds de l'arbre parcourus en ordre suffixe (fils gauche, fils droit, noeud) (méthode itérative) """
Plan de test
>>> parcours_suffixe_iter(arbre1) ['H', 'U', 'R', 'S', 'T', 'A'] >>> parcours_suffixe_iter(arbre2) [5, 23, 3, 41, 7, 19, 11, 2, 37] >>> parcours_suffixe_iter(arbre3) ['K', 'G', 'I', 'E', 'S', 'L', 'F', 'P', 'C', 'B', 'A', 'Z']
Une piste
Pour programmer ce parcours, vous avez besoin d'utiliser une pile.
- Soit vous utilisez une structure de pile programmée plus tôt dans l'année.
- Soit vous utilisez un tableau (liste Python) comme une pile dont
le dernier élément est le sommet de la pile (dépilé avec
.pop()
, empilé avec.append()
).
Un algorithme
C'est presque le même algorithme que celui de la fonction précédente, mis à part qu'on place le nouveau nœud parcouru au début du tableau de parcours.