1 Arbres

Transcription

1 Arbres
Licence Sciences et technologies
Informatique/Mathématiques/Mathématiques-Informatique
Algorithmique et Programmation II
TD numéro 5 : Files et arbres
Université de Provence
Année 2006-2007
corrections
1
Arbres
On rappelle que le type abstrait Arbre est muni des opérations suivantes :
Type Arbre
utilise Elt
creer : -> Arbre
construire : Elt , Arbre, Arbre -> Arbre
fils_droit : Arbre -> Arbre
fils_gauche : Arbre -> Arbre
valeur : Arbre -> Elt
vide : Arbre -> Booleen
Il est implanté en C de la manière suivante :
typedef struct Noeud * Arbre;
struct noeud {Arbre gauche;
Elt el;
Arbre droit;};
Exercice 1 Ecrire en C les fonctions suivantes :
– feuille retournant vrai si un arbre a est une feuille et faux sinon.
– present qui teste si un élément e apparaı̂t à un noeud de l’arbre a.
– hauteur qui calcule la hauteur de l’arbre a.
Solution 1 Un arbre est une feuille s’il ne possède ni sous-arbre droit, ni sous-arbre gauche.
int feuille(Arbre a)
{ return (vide(fils_droit(a)) && vide(fils_gauche(a)));}
Un élément e ne peut être présent dans l’arbre vide. Il est présent dans un arbre si il est à la
racine de l’arbre, ou soit dans le sous-arbre droit, soit dans le sous-arbre gauche.
On va supposer ici que Elt est le type int.
int present(int e, Arbre a)
{ if vide(a) return 0
else if (valeur(a) == e) return 1
else return (present(e,fils_droit(a)) || present(e,fils_gauche(a))) ;}
La hauteur d’un arbre est la longueur de sa plus longue branche. La plus longue branche d’un arbre
est soit la plus longue branche du sous-arbre droit augmentée de 1 soit la plus longue branche du
sous-arbre gauche augmentée de 1 selon la plus longue se trouve dans le sous-arbre droit ou le
sous-arbre gauche.
int hauteur(Arbre a)
{ if vide(a) return 0
else return 1+max(hauteur(fils_droit(a)),hauteur(fils_gauche(a)));}
Exercice 2 Ecrire en C la fonction suivante
Arbre extensiond(Arbre a1, int pos, Arbre a2)
Cette fonction étend un arbre en greffant l’arbre a2 comme fils droit de la posieme feuille de l’arbre
a1.
Solution 2 Notons tout d’abord que l’arbre a1 ne peut être vide car sinon il ne possèderait pas
de feuille. De plus, pos doit être inférieur au nombre de feuille de l’arbre a1.
Supposons qu’on souhaite ajouter l’arbre a2 comme 10ième feuille de l’arbre a1.
Supposons que le sous-arbre gauche de a1 possède 20 feuilles alors la 10ième feuille de l’arbre a1
est également la 10ième feuille du sous-arbre gauche de l’arbre a1.
Supposons maintenant que le sous-arbre gauche de a1 possède 2 feuilles alors la 10ième feuille de
l’arbre a1 est également la 8ième feuille du sous-arbre droit de l’arbre a1.
Ecrivons tout d’abord la fonction qui permet de calculer le nombre de feuilles d’un arbre.
int nbfeuilles(Arbre a)
{if (vide(a)) return 0
else if (feuille(a)) return 1
else return nbfeuilles(fils_droit(a)) + nbfeuilles(fils_gauche(a));}
On écrit maintenant la fonction extensiond. Il faut faire attention au fait que le fonction est
définie de manière récursive mais que c’est l’arbre sur lequel on fait la greffe qui doit être retourné.
Arbre extensiond(Arbre a1, int pos, Arbre a2)
{return extensiond_bis(a1,pos,a2,a);}
Arbre extensiond_bis(Arbre a1, int pos, Arbre a2, Arbre a)
{if (feuille(a)) {a1.fils_droit=a2;
return a;}
else if (nbfeuilles(fils_gauche)>=pos) return extensiond_bis(fils_gauche(a1), pos, a2, a)
else return extensiond_bis(fils_droit(a1), pos-nbfeuilles(fils_gauche(a1)), a2, a);
2

Documents pareils