Nicolas Gourmelon TP : épreuve terminale
11 mai 2012 Calculs Scientifique et Symbolique avancés
On vérifiera sur des exemples simples le bon fonctionnement de chaque algorithme.
Exercice 1 : Arbres binaires
On définit sous maple récursivement un arbre binaire réel de la façon suivante :
- l’arbre binaire vide est la liste vide [],
- un arbre binaire non vide est une liste [α, g, d],
où α∈Rest la valeur à la racine de l’arbre, gest le fils gauche et dest le fils droit. Les feuilles
d’un l’arbre Asont les sous-arbre de la forme
[α, [],[]] .
La profondeur d’un noeud est la distance d’un noeud à la racine (la racine étant de profondeur
0). La profondeur d’un arbre est la profondeur maximale de ses feuilles (donc de ses noeuds).
1. Ecrire une procédure qui à un arbre renvoie sa profondeur.
2. Un binaire est dit complet si toutes les feuilles sont de profondeur pou p−1. Ecrire un
algorithme qui détermine si un arbre binaire est complet ou pas.
Lorsqu’un arbre binaire est complet, il est pratique de représenter l’arbre sous la forme de la liste
des valeurs de ses noeuds [x1, ..., xn], où x1est la racine et où x2ket x2k+1 sont respectivement
le fils gauche et le fils droit de xk, pour tout k>1tel que 2k+ 1 6n.
3. Ecrire une pocédure qui à un arbre binaire complet présenté de la première manière renvoie
un arbre binaire présenté de la seconde. Ecrire une procédure qui fait la traduction inverse.
Exercice 2 : Tri par tas
Dans la suite, les arbres binaires complets seront présentés sous la forme d’une liste [x1, ..., xn]de
réels (cf. exercice 2). Un tas est un arbre binaire complet tel que pour tout noeud anon-racine,
on a a6p(a), où p(a)est le père de a.
1. Ecrire un algorithme qui vérifie qu’un arbre binaire est un tas.
2. Pour ajouter un élément xn+1 à un tas [x1, ..., xn], on considère l’arbre binaire complet
[x1, ..., xn, xn+1]. A priori ce n’est pas un tas, car xn+1 peut être plus grand que son père. Ecrire
une procédure ajout qui, en faisant remonter le nouvel élément xn+1 dans l’arbre binaire ainsi
obtenu, renvoie à un élément xn+1 et à un tas [x1, ..., xn]un nouveau tas dont les noeuds sont
x1, ..., xn, xn+1.
3. On veut recréer un tas à partir de la liste [x1, ..., xn]dont on a enlevé le plus grand élément
x1. On considère l’arbre binaire complet [xn, x2, x3, ..., xn−1]. On fait alors redescendre xnà
l’intérieur de l’arbre binaire de la façon suivante : si xnest plus grand que son fils gauche et son
fils droit, alors l’arbre est un tas et c’est terminé, sinon on échange xnavec l’aîné de ses fils. Puis
on répète le procédé.
Ecrire une procédure retrait qui à un tas [x1, ..., xn]renvoie un tas dont les noeuds sont x2, ..., xn.
Le tri par tas d’une liste [x1, ..., xn]s’effectue en deux temps de la façon suivante :
1