Correction TP 5 :Types de donn´ees abstraits arbre
Licence 2 MASS semestre 2, 2007/2008
Exercice 1 : Arbre de Nombres
a- Algorithme somme(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retourner racine(a) + somme(arbreGauche(a)) + somme(arbreDroit(a)) fin si
fin
b- Algorithme maximum(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retournermax2(racine(a),max2(maximum(arbreGauche(a)), maximum(arbreDroit(a)) ))
fin si fin
Il faut pour cet algorithme des nombres au dessus de 0. Je propose d’autres algorithmes :
Algorithme maximumR(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
siarbreEstVide?(arbreGauche(a))alors siarbreEstVide?(arbreDroit(a))alors
retournerracine(a) sinon
retournermax2(racine(a), maximumR(arbreDroit(a)) ) fin si
sinon
siarbreEstVide?(arbreDroit(a))alors
retournermax2(racine(a), maximumR(arbreGauche(a)) ) sinon
retournermax2(racine(a),max2(maximumR(arbreGauche(a)), maximumR(arbreDroit(a)) ))
fin si
fin si fin si fin
Ou encore une r´ecursivit´e terminale :
Algorithme maximumIter(a: arbre,m: r´eel) : entier d´ebut
siarbreEstVide?(a)alors retournerm
sinon
siracine(a)< malors
retournermax2(maximumIter(arbreGauche(a),m), maximumIter(arbreDroit(a), m) )
sinon
retournermax2(maximumIter(arbreGauche(a), racine(a)), maximumIter(arbreDroit(a), racine(a)) )
fin si fin si fin Avec :
Algorithme maximumI(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retournermaximumIter(a, racine(a)) fin si
fin
Ou encore pour r´egler le cas de la valeur par d´efault :
Algorithme maximumDef(a: arbre, valeurDefaut : entier) : entier d´ebut
siarbreEstVide?(a)alors retournervaleurDefaut sinon
retournermax2(racine(a),max2(maximum(arbreGauche(a)), maximum(arbreDroit(a)) ))
fin si fin avec :
Algorithme maximumD(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retournermaximumDef(a, racine(a)) fin si
fin
Exercice 2 : Propri´ et´ es d’un arbre
a- Algorithme nbNoeud(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retourner1 + nbNoeud(arbreGauche(a)) + nbNoeud(arbreDroit(a)) fin si
fin
b- Algorithme hauteur(a: arbre) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
retourner1 + max2(hauteur(arbreGauche(a)), hauteur(arbreDroit(a) ))
fin si fin
o`umax2 retourne le maximum de 2 nombres en param`etre
Exercice 3 : Parcours
a-
orage
bleus
diamant temps
fleur
or patiente voyage
b- ǫest le mot vide
Algorithme prefixe(a: arbre) : mot d´ebut
siarbreEstVide?(a)alors retournerǫ
sinon
retournerconcat(racine(a), concat(arbreGauche(a), arbreDroit(a))) fin si
fin
Algorithme infixe(a: arbre) : mot d´ebut
siarbreEstVide?(a)alors retournerǫ
sinon
retournerconcat(arbreGauche(a), concat(racine(a), arbreDroit(a))) fin si
fin
Algorithme postfixe(a: arbre) : mot d´ebut
siarbreEstVide?(a)alors retournerǫ
sinon
retournerconcat(arbreGauche(a), concat(arbreDroit(a), racine(a))) fin si
fin
c- pr´efixe : oragediamantblausorfleurtempspatientevoyage infixe : bleusdiamantfleurororagepatientetempsvoyage postfixe : bleusfleurordiamantpatientevoyagetempsorage
Exercice 4 : Filtre
a- Algorithme extraitMots(a: arbre) : arbre d´ebut
siarbreEstVide?(a)alors retournerarbreVide() sinon
silettre(racine(a), 0) = ’m’alors
retournerarbreCons(”mama”, extraitMots(arbreGauche(a)), extraitMots(arbreDroit(a))) sinon
retournerarbreCons(racine(a), extraitMots(arbreGauche(a)), extraitMots(arbreDroit(a))) fin si
fin si fin
Exercice 5 : Recherche
a-
55
12 78
54
22
30 51
32
61
b- Algorithme recherche(a: arbre d’entier,n: entier) : booleen d´ebut
siarbreEstVide?(a)alors retournerfaux
sinon
siracine(a) = nalors retournervrai sinon
siracine(a)< nalors
retourner recherche(arbreDroit(a), n) sinon
retourner recherche(arbreGauche(a), n) fin si
fin si fin si fin
Le nombre de comparaisons est au plus la hauteur de l’arbre.
c- Algorithme maximum(a: arbre d’entier) : entier d´ebut
siarbreEstVide?(a)alors retourner0
sinon
siarbreEstVide?(arbreDroit(a))alors retournerracine(a)
sinon
retourner maximum(arbreDroit(a)) fin si
fin si
fin
Aucune comparaison n’est faite bien sur...
Par contre, le nombre de test de l’ordre de 2 fois le nombre d’´el´ements sur la droite de l’arbre qui est major´e par la hauteur de l’arbre.
d- Algorithme ajout(n: entier,a: arbre d’entier) : arbre d’entier d´ebut
siarbreEstVide?(a)alors
retournerarbreCons(n, arbreVide(), arbreVide()) sinon
sin <racine(a)alors
retournerarbreCons(racine(a), ajout(n, arbreGauche(a)), arbreDroit(a)) sinon
siracine(a)< nalors
retournerarbreCons(racine(a), arbreGauche(a), ajout(n, arbreDroit(a))) sinon
retournera fin si
fin si fin si fin
e- Algorithme supprimer(a: arbre d’entier) : arbre d’entier d´ebut
siarbreEstVide?(a)alors retournerarbreVide() sinon
siarbreEstVide?(arbreGauche(a))alors retournerarbreDroit(a)
sinon
siarbreEstVide?(arbreDroit(a))alors retournerarbreGauche(a)
sinon
retournerarbreCons(max(arbreGauche(a)), supprimerMax(arbreGauche(a)), arbreDroit(a))
fin si fin si fin si fin
Algorithme supprimerMax(a: arbre d’entier) : arbre d’entier d´ebut
siarbreEstVide?(a)alors retournerarbreVide() sinon
siarbreEstVide?(arbreDroit(a))alors retournerarbreGauche(a)
sinon
retournerarbreCons(racine(a), arbreGauche(a), supprimerMax(arbreDroit(a))) fin si
fin si fin
Exercice 6 : Taches prioritaires
a- un peu d’imagination...
b- Algorithme supprimer(a: arbre de couple,s: entier) : arbre de couple d´ebut
siarbreEstVide?(a)alors retournerarbreVide() sinon
siracine(a)≤salors retournerarbreVide() sinon
retournerarbreCons(racine(a), supprimer(arbreGauche(a),s), supprimer(arbreDroit(a), s))
fin si fin si fin