Universit´e Paris-Saclay Master Bioinformatique – M1 BIBS 2015-2016
Algorithmique et complexit´e
Projet not´e : Arbres N-aires
Jusqu’`a maintenant vous avez ´etudi´e les arbres binaires. Il est n´eanmoins possible de repr´esenter
des arbres dont les nœuds peuvent avoir plus que deux fils chacun (et plus qu’une seule cl´e). Il
existe pour cela des structures de donn´ees sp´ecialis´ees comme, par exemple, les B-arbres (B-trees),
les arbres bicolores (red-black trees) ou encore les tries.
Pour ce projet nous allons nous contenter de d´efinir et d’impl´ementer une structure tr`es simple
que l’on appelle arbre N-aire.
1 D´efinition
On appelle arbre N-aire un arbre dont les nœuds peuvent chacun avoir entre 0 et Nfils. De
plus, on impose l’invariant suivant : `a tout moment, tous les nœuds qui sont des fr`eres sont tri´es
dans l’ordre lexicographique.
Figure 1: Un exemple d’arbre N-aire. Ici, Nvaut au
moins 3.
La Figure 1 montre un exemple
d’arbre N-aire. La racine de l’arbre
est ´etiquet´ee par le symbole /, et elle
a deux fils, respectivement ´etiquet´es
etc et home. Le nœud etc n’a pas
de fils. En revanche, le nœud home
a trois fils, respectivement ´etiquet´es
bill,linus et steve.
On dit que home est le nœud par-
ent de bill,linus et steve.
Les nœuds ´etiquet´es etc et home
sont dits fr`eres, puisqu’ils sont les
nœuds fils d’un mˆeme nœud parent.
Pareil pour bill,linus et steve.
En revanche, les nœuds ´etiquet´es
windows.txt et Documents ne sont
pas des fr`eres (car leurs nœuds par-
ents sont diff´erents).
2 Structures de donn´ees
Cr´eez un fichier narbre.h et placez-y les structures suivantes :
struct Noeud – structure compos´ee de deux champs id et nfils (de type entier) repr´esentant
respectivement l’identifiant et le nombre de fils du nœud courant ; de deux champs fils et
frere (de type pointeur de Noeud) repr´esentant respectivement des liens vers les fils et les
fr`eres du nœud courant ; et d’un champ etiquette (de type pointeur de char) qui retient
l’´etiquette associ´ee au nœud. (R´ef´erez-vous aussi `a la Figure 2.)
struct NArbre – structure compos´ee d’un champ racine (de type pointeur de Noeud) pour
la racine de l’arbre, et de deux champs nb noeuds et N(de type entier) repr´esentant re-
spectivement le nombre de nœuds pr´esents dans l’arbre et le nombre maximal de fils par
nœud.
1
Figure 2: Structure d’un nœud.
Remarques : Chaque nœud d’un arbre N-aire doit avoir un identifiant unique. Par contre, il
peut y avoir plusieurs nœuds ´etiquet´es par la mˆeme chaˆıne de caract`eres (le champ etiquette du
type Noeud). Le champ de l’arbre retenant le nombre de nœuds ( nb noeuds) permet d’attribuer `a
chaque nœud nouvellement cr´e un identifiant unique.
Conventions : L’identifiant du nœud racine vaut 0. Si un nœud donn´e n’a pas de fils (fr`eres),
alors son champ fils (frere) vaut NULL.
Ces structures permettront de repr´esenter un arbre N-aire d’une fa¸con exploitable de point de
vue informatique. La repr´esentation correspondant `a l’arbre N-aire de la Figure 1 est illustr´ee
dans la Figure 3.
Figure 3: Repr´esentation ´equivalente du N-arbre dans la Figure 1. Les nœuds de cet arbre
suivent la repr´esentation propos´ee dans la Figure 2. Le symbole signifie NULL.
3 API
Cr´eez ensuite les fonctions ci-dessous dans un fichier narbre.c avec les prototypes associ´es
dans le fichier narbre.h. Il s’agit d’une API (Application Programming Interface), ce qui veut dire
que (i) vous devez impl´ementer ces fonctions telles qu’elles sont sp´ecifi´ees, mais (ii) vous avez bien
sˆur droit `a d´efinir toutes les fonctions suppl´ementaires que vous jugez n´ecessaires pour assurer le
fonctionnement correct de l’API.
3.1 Fonctions demand´ees
1. NArbre *nouvel arbre(int N, char *etiquette) – Cr´ee (avec allocation m´emoire) un
nouvel arbre N-aire. Nrepr´esente le nombre maximal de fils par nœud, et etiquette est
l’´etiquette de la racine de l’arbre. La fonction renvoie un pointeur vers cet arbre.
2. Noeud *nouveau noeud(char *etiquette) – Cr´ee (avec allocation m´emoire) un nouveau
nœud ´etiquet´e par la chaˆıne de caract`eres point´ee par etiquette. Renvoie un pointeur vers
ce nœud. Vous autoriserez une longueur de la chaˆıne de caract`eres inf´erieure ou ´egale `a 16. Si
la chaˆıne point´ee par etiquette en contient plus, vous garderez uniquement les 16 premiers
caract`eres. Vous aurez besoin d’allouer de la m´emoire s´epar´ement pour le champ etiquette
du nœud.
Indication : Vous pouvez utiliser les fonctions strlen et strncpy d´efinies dans string.h.
Rappelez-vous qu’une chaˆıne de caract`eres est un tableau de char dont le dernier ´el´ement est
le caract`ere nul '\0'.
2
3. void free arbre(NArbre *A) – Lib`ere la m´emoire allou´ee `a l’arbre (ainsi que pour tous ses
nœuds et chaˆınes de caract`eres allou´ees dynamiquement).
4. void affiche arbre(NArbre *A) – Affiche l’arbre re¸cu en argument.
D’abord, un message est affich´e, pour dire quel est le nombre total de nœuds de l’arbre, et
pour afficher la valeur de N.
Ensuite, pour chaque nœud n, il faut afficher l’identifiant du nœud entre parenth`eses, suivi
d’un espace, suivi de la chaˆıne de caract`eres repr´esent´ee par n->etiquette.
L’affichage commence par la racine de l’arbre. Cette ligne est situ´ee le plus `a gauche possible.
Tous les nœuds fr`eres apparaissent au mˆeme niveau (colonne `a l’´ecran). Les fils d’un nœud
re¸coivent chacun une indentation de 5 espaces par rapport au niveau de leur nœud parent.
Voici le r´esultat de affiche arbre sur l’arbre N-aire de la Figure 3 (ici Nvaut 3) :
L’arbre a 11 noeud(s), N = 3.
( 0) /
( 2) etc
( 1) home
( 7) bill
( 8) windows.txt
( 5) linus
( 6) Documents
(10) penguins.c
( 3) steve
( 4) Documents
( 9) apples.h
5. int ajout noeud(NArbre *A, char *etiquette, int id parent) – Ajoute un nouveau
nœud comme fils du nœud dont l’identifiant est id parent. Le nouveau nœud est ´etiquet´e
par la chaˆıne de caract`eres etiquette. L’ajout d’un nouveau nœud `a la liste de fils du nœud
parent (dont l’identifiant est id parent) doit se faire dans l’ordre lexicographique.
Indication : Vous pouvez utiliser la fonction strcmp d´efinie dans string.h.
La fonction renvoie l’identifiant du nœud nouvellement cr´e, ou -1 si l’ajout n’est pas possible.
Ceci peut arriver : (i) si l’identifiant du parent n’est pas valide (s’il est inf´erieur `a z´ero), (ii)
si l’identifiant du parent n’est pas trouv´e, (iii) si le parent est d´ej`a rempli, ou (iv) si le parent
poss`ede d´ej`a un fils ayant la mˆeme ´etiquette etiquette. Si l’ajout d’un nouveau nœud
´echoue, un message doit ˆetre affich´e sur le flux standard d’erreur pour en expliquer la cause.
3
3.2 Exemple d’utilisation de l’API
Voici comment utiliser l’API que vous venez d’impl´ementer pour cr´eer et afficher l’arbre N-aire
de la Figure 3 :
1NArbre *A;
2int home,bill,linus,steve,dlinus,dsteve;
3
4A=nouvel_arbre(3, "/");
5
6home =ajout_noeud(A, "home", 0);
7ajout_noeud(A, "etc", 0);
8steve =ajout_noeud(A, "steve", home);
9dsteve =ajout_noeud(A, "Documents", steve);
10 linus =ajout_noeud(A, "linus", home);
11 dlinus =ajout_noeud(A, "Documents", linus);
12 bill =ajout_noeud(A, "bill", home);
13 ajout_noeud(A, "windows.txt", bill);
14 ajout_noeud(A, "apples.h", dsteve);
15 ajout_noeud(A, "penguins.c", dlinus);
16
17 affiche_arbre(A);
18
19 free_arbre(A);
Votre code sera ´evalu´e dans le cadre d’un client de test du mˆeme style (mais qui teste en plus
les cas particuliers mentionn´es) ; il est donc important que vous suivez cette API `a la lettre.
4´
Evaluation
Vous m’enverrez par mail vos fichiers narbre.c et narbre.h `a [email protected]
avant dimanche le 8 mai 2016 `a minuit. Un projet rendu en retard ne sera pas corrig´e. Le travail
demand´e est un travail individuel.
Votre code sera ´evalu´e selon plusieurs crit`eres, notamment : le respect de la sp´ecification de
l’API, la justesse du code et des r´esultats. Une attention particuli`ere sera apport´ee aux avertisse-
ments de compilation (options -Wall et -ansi pour gcc), ainsi qu’aux fuites de m´emoire et aux
erreurs d´etect´ees par valgrind. (R´ef´erez-vous aux TPs n°2 et 3.)
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !