TD - Lipn - Université Paris 13

publicité
Université Paris 13
Licence Info 2ème année - SPI
Institut Galilée
Année 2015-2016
Structures de données élémentaires
TD 5
18 Décembre 2015
Exercice 1
Pour résoudre les exercices qui suivent, on utilise des
l'aide des opérations suivantes:
arbres binaires qu'on manipule uniquement à
arbreVide () ⇒ crée un arbre binaire vide;
I x ← racine (A) ⇒ permet de stocker dans x l'élément contenu dans le n÷ud racine de l'arbre A;
I A0 ← gauche (A) ⇒ aecte le ls gauche de A à A0
I A0 ← droit(A) ⇒ aecte le ls droit de A à A0
I A ← construire (x, A1 , A2 ) ⇒ construit l'arbre A ayant racine x, ls gauche A1 et ls droit A2
IA ←
On dispose aussi du prédicat unaire estVide (A) dont la valeur est vrai si son argument A est un arbre
vide, faux sinon.
1) Considérons l'algorithme récursif AlgoTD05.1 en gure 1.
Donner le tableau de simulation de l'algorithme algoAppelant qui s'en sert.
Que fait l'algorithme AlgoTD05.1?
2) Considérons l'algorithme récursif AlgoTD05.2 en gure 1.
Donner le tableau de simulation lorsque A est l'arbre binaire (a) suivant.
Que fait cet algorithme?
8
/
\
3
4
/ \
\
2
7
12
/
9
(a)
/
[*]
[+]
\
[:]
/
\
/
\
8
[-] 6
[+]
/ \
/ \
7
4
3 2
(b)
3) Considérons l'algorithme récursif AlgoTD05.3 en gure 1.
Donner le tableau de simulation lorsque A est l'arbre binaire (a) de la question précédente.
Que fait cet algorithme?
Exercice 2
Les arbres binaires peuvent être utilisés pour mémoriser des expressions arithmétiques.
Pour ce faire, les n÷uds intérmediaires doivent représenter des opérations, et les feuilles des nombres
entiers. L'arbre binaire (b) précédent en est un exemple.
Écrire un algorithme CalculArithmétique qui prend comme argument un tel arbre et renvoie le
résultat de l'expression. Vous pourrez vous servir de la fonction estFeuille() qui renvoie vrai si un
arbre est une feuille, faux sinon.
Une telle fonction est-elle susante pour dénir le cas base de votre algorithme? Pourquoi?
algoAppelant()
declare A: arbre binaire d'entiers;
1
A ← arbreVide ()
2
AlgoTD05.1(A, 8)
3
AlgoTD05.1(A, 2)
4
AlgoTD05.1(A, 9)
5
AlgoTD05.1(A, 5)
AlgoTD05.1(A, x)
argtype A: arbre binaire d'entiers; x: entier;
declare A0, A00: arbre binaire d'entiers; y : entier;
1
if(estVide (A))
2
A0 ← arbreVide (); A00 ← arbreVide ();
3
A ← construire (x, A0, A00 )
4
else
5
y ← racine (A)
6
if(x ≤ y )
7
A0 ← gauche (A)
8
else
9
A0 ← droit(A)
10
endif
11
AlgoTD05.1(A0,x)
12
endif
AlgoTD05.2(A)
argtype A: arbre binaire d'entiers;
returns entier;
declare A0, A00: arbre binaire d'entiers; y1 , y2 : entier;
1
if(estVide (A))
2
return 0
3
else
4
A0 ← gauche (A); y1 ← AlgoTD05.2(A0 )
A00 ← droit(A) y2 ← AlgoTD05.2(A00 )
5
6
return 1+ max (y1 , y2 )
7
endif
AlgoTD05.3(A)
argtype A: arbre binaire d'entiers;
returns entier;
declare A0, A00: arbre binaire d'entiers; y , y0, y00: entier;
1
if(estVide (A))
2
return 0
3
endif
4
y ← racine (A)
5
A0 ← gauche (A); y0 ← AlgoTD05.3(A0 ); y = y+y0
A00 ← droit(A); y00 ← AlgoTD05.3(A00 ); y = y+y00
6
7
return y
Figure 1: Algorithmes pour l'exercice 1.
estFeuille(A)
argtype A: arbre binaire
returns booléen;
1
2
3
4
5
d'entiers;
if(estVide (A))
return faux
else
return estVide (gauche (A)) &&
endif
estVide (droit(A))
Figure 2: L'algorithme estFeuille() pour l'exercice 2.
Téléchargement