Académique Documents
Professionnel Documents
Culture Documents
Salsabila BENGHAZOUANI
TD 3
Arbres binaires : implémentation Python,
programmation récursive
Dans ce TD, nous allons implémenter des arbres binaires en Python. On choisit
de représenter l’arbre vide par la liste vide, et un arbre de racine étiquetée par e et
fils fg et fd par la liste [e, fg, fd]
Exercice 1 — Pour se mettre en route
Représenter (crayon/papier !) les arbres définis respectivement en Python via :
a0 = [15, [], []]
a1 = [18, [12, [], [17, [], []]], [30, [15, [], []], []]]
a2 = [19, [42, [], [17, [10, [], []], []]], [15, [35, [], []], [12, [], []]]]
1
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
somme_feuilles(abr)
La somme des nœuds feuilles est : 15
5. Écrivez une fonction qui retourne vrai si l'arbre binaire donné est SommeEnfants sinon faux.
Un SommeEnfants est un arbre binaire où la valeur d'un nœud est égale à la somme des nœuds
présents dans son sous-arbre gauche et son sous-arbre droit.
Un arbre vide est SommeEnfants et la somme d'un arbre vide peut être considérée comme 0.
Un nœud feuille est également considéré comme SommeEnfants.
Exemple
SommeEnfants(a)
True
2
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
On va calculer de façon récursive la liste des étiquettes d’un arbre. Le principe est toujours le
même : accoler l’étiquette de la racine, les étiquettes du fils gauche, et celles du fils droit.
Mais dans quel ordre ?
— dans le parcours infixe, l’étiquette de la racine est au milieu ;
— dans le parcours préfixe, elle est au début ;
— dans le parcours suffixe, elle est à la fin.
Par exemple, pour l’arbre a1, ces parcours sont respectivement :
[12, 17, 18, 15, 30] [18, 12, 17, 30, 15] [17, 12, 15, 30, 18]
1. Ecrire une fonction récursive retournant la liste des étiquettes d’un arbre,
parcouru de façon infixe.
On pourra concaténer des listes via l’opérateur +
Exercice 5 — Miroir
Ecrire une fonction calculant le miroir d’un arbre donné (au sens d’une symétrie par
rapport `a un axe vertical ).
>>> miroir(complet(2))
[1, [3, [7, [], []], [6, [], []]], [2, [5, [], []], [4, [], []]]]
Le principe est de faire évoluer une liste passée en paramètre, et qui contient les
étiquettes rencontrées jusqu’ici.
1. Ecrire une fonction infixe_entasse prenant en entrée un arbre et une liste, de sorte que
l’appel infixe_entasse(a, debut) ajoute successivement dans la liste debut les étiquettes
rencontrées dans l’arbre a (de façon infixe) ; rien n’est renvoyé.
2. En déduire une fonction infxe_lineaire calculant la liste infixe des étiquettes d’un
arbres en ne réalisant que des append.
3
Lycée Mohamed 5 – CASA Pr.Salsabila BENGHAZOUANI
Exercice 7 —
1. Quelle est la hauteur maximale d’un arbre binaire à n nœuds ?
2. Quel est le nombre maximal de feuilles d’un arbre de hauteur h ?
3. Quel est le nombre maximal de nœuds d’un arbre de hauteur h ?
4. Quelle est la hauteur minimale d’un arbre de n nœuds ?
5. Quel est le nombre maximal de nœuds au niveau k dans un arbre binaire ?
6. Quelle est la particularité du nombre de nœuds des arbres binaires complets ? (Rmq : un
arbre binaire complet est soit une feuille soit un nœud dont les deux fils sont des arbres
binaires complets.)
7. Quel est le nombre de feuilles d’un arbre binaire complet à n nœuds ?
Exercice 8 —
Un arbre équilibré permet de conserver une complexité algorithmique constante pour
certaines opérations. Or l'équilibre de l'ABR n'est pas garanti. Il existe d'autres structures
d'arbres pour ça.
Pourtant on vous demande dans certains tests de vérifier que votre ABR est équilibré.
La définition communément admise de l'équilibre d'un arbre est que la hauteur des deux sous-
arbres de chaque nœud ne peut excéder 1.