You are on page 1of 54

REPUBLIQUE TUNISIENNE MINISTERE DE LENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUES ET TECHNOLOGIQUES

UNIVERSITE DE JENDOUBA FACULTE DES SCIENCES JURIDIQUES, ECONOMIQUES ET DE GESTION DE JENDOUBA

Fascicule de Travaux Dirigs


Algorithmique et structures de donnes II
Adress aux tudiants de 1re anne Licence Fondamentale en Informatique Applique la Gestion

Equipe pdagogique :

- Riadh IMED FEREH (Matre de confrences en Informatique) - Riadh BOUSLIMI (Technologue en Informatique)

Anne Universitaire : 2008-2009

PREFACE
e fascicule des travaux dirigs dalgorithmique et structures de donnes II est lintention des tudiants de la premire anne en Licence en Informatique Applique la Gestion de la Facult des Sciences Juridiques, conomique et de Gestion de Jendouba. Il aborde brivement les thmes les plus classiques et les plus utiliss en informatique : les enregistrements, les fichiers, la rcursivit, les listes chaines, les piles, les files et les arbres binaires de recherche. Le fascicule comporte 5 TD avec leurs corrections qui sont rparties comme suit : TD1 : Les enregistrements et les fichiers TD2 : La rcursivit TD3 : Les listes chaines TD4 : Les piles et les files TD5 : Les arbres binaires de recherche Une fois que ltudiant obtenue une connaissance suffisante sur la manipulation des types simples, dans ce fascicule nous dbuterons par un TD1 qui est consacr pour la manipulation des types complexes(les enregistrements), et sur les fichiers squentiels. Ltudiant sera capable la fin du TD1 manipuler les fichiers. Dans le TD2, nous traiterons les sous-programmes rcursifs, nous allons voir de plus prs le mcanisme de transformation dun programme itrative en un programme rcursif. Ltudiant dans ce TD doit savoir excuter la main en utilisant une pile. Aprs avoir traiter les programmes en version rcursifs, le TD3 sera sur lallocation dynamique aprs avoir vu au part avant lallocation statique. Dans ce TD nous traiterons les listes chaines que ce soit simple, double ou circulaire. Ltudiant doit apprendre crer une liste, la parcourir et enfin savoir comment supprimer un lment. Le TD4 est une suite du prcdent, vu quil sagit dune liste chaine avec des stratgies daccs, pour les piles, ils utilisent la stratgie (Last In First Out) et pour les files (First In First out). Nous dfinirons les diffrents sous-programmes qui seront utiles pour manipuler ces derniers. A la fin nous entamerons le TD5 qui sera consacr pour la manipulation des arbres binaires de recherche. Nous allons traiter dans celui-l les diffrents algorithmes avancs : la rotation, la fusion, la vrification dun arbre sil est parfait, dgnr, Enfin, nous esprons que le prsent ouvrage aura le mrite dtre un bon support pdagogique pour lenseignant et un document permettant une concrtisation exprimentale pour ltudiant.

Les auteurs Riadh IMED Fareh Riadh BOUSLIMI

Page 1 sur 53

Table des matires

TD n 1(Les enregistrements et les fichiers)........................................................................................ 3 Correction du TD n1............................................................................................................................ 5 TD n 2(Rcursivit)............................................................................................................................ 12 Correction du TD n2.......................................................................................................................... 14 TD n 3 (Les Listes chaines).............................................................................................................. 20 Correction du TD n3.......................................................................................................................... 22 TD n 4(Les piles et les files) ............................................................................................................... 33 Correction du TD n4.......................................................................................................................... 34 TD n 5(Arbre binaire de recherche)................................................................................................. 37 Correction du TD n5.......................................................................................................................... 40 BIBLIOGRAPHIE.................................................................................................................................... 53

Page 2 sur 53

Anne Universitaire : 2008/2009 Semestre 2


Module : Algorithmique et structures de donnes II Classe : 1re anne LFIAG Facult des Sciences Juridiques, Economiques et de Gestion de Jendouba

Charg de cours : Riadh IMED FEREH Charg de TD : Riadh BOUSLIMI

TD n 1(Les enregistrements et les fichiers) (Les enregistrements et les fichiers)


Objectifs
Manipuler correctement des variables de type enregistrement. Comprendre les concepts de base relatifs aux fichiers. Manipuler des fichiers organisation squentielle.

EXERCICE N1 Crer un enregistrement nomm Etudiant qui est caractris par un identifiant, un nom et un prnom. On vous demande de saisir 10 tudiants, les ranger dans un tableau puis les afficher. EXERCICE N2 On reprend lexercice prcdent mais on rajoute en plus pour chaque tudiant ses deux notes. On vous demande de crer le nouvel enregistrement nomm Notes qui est caractris par NoteCc (Note de contrle continu) et NoteEx (Note dexamen). Modifier lenregistrement Etudiant afin quelle puisse tre en relation avec lenregistrement Notes . On vous demande de crer : Une procdure de saisi des tudiants ainsi leurs notes. Une procdure daffiche des tudiants avec leurs notes. Une fonction qui renvoie ltudiant qui a eu la meilleure note dexamen. Une fonction qui renvoie la moyenne gnrale de la classe.
0.3 0.7

Afficher la meilleure note dexamen et la moyenne gnrale de la classe. crire le programme principal faisant appel aux diffrents sous-programmes. EXERCICE N3 On souhaite mmoriser des noms des personnes dans un fichier nomm pers.dat . On vous demande alors de crer les sous-programmes qui suivent : Une procdure de cration du fichier qui contient les noms des personnes. Une procdure daffichage des noms de personnes. Une fonction qui permet de chercher un nom pass en argument et qui renvoie vrai si ce dernier est existant et faux sinon. Une procdure qui copie les noms sans compter le nom pass en paramtre. crire le programme principal faisant appel aux diffrents sous-programmes.
Page 3 sur 53

EXERCICE N4 On souhaite mmoriser les tudiants de la facult ainsi que leurs notes dans un fichier nomm fichetu.dat . Un tudiant est caractris par un identifiant, un nom et un prnom. Chaque tudiant aura deux notes : une note de contrle contenu et une note dexamen. Travail faire : 1. Crer les enregistrements ncessaires pour laborer ce programme. 2. crire une procdure permettant de saisir les notes associes un tudiant donn en paramtre. 3. crire une procdure permettant de crer le fichier des tudiants. 4. crire une procdure qui permet de copier les tudiants qui ont eu une moyenne suprieure ou gale 10 du fichier fichetu.dat dans un tableau des tudiants. 5. crire une procdure qui permet de trier un tableau dtudiants dans lordre dcroissant selon leurs moyennes. 6. crire une procdure qui permet de crer le fichier nomm res.dat qui contiendra les tudiants qui sont russt, tri dans lordre dcroissant. 7. crire une procdure qui permet dafficher le contenu du fichier res.dat . 8. crire le programme principal qui fait appel aux diffrents sous-programmes.

Page 4 sur 53

Correction du TD n1
EXERCICE N1
Algorithme GesEtud Type Etudiant : Enregistrement Ident : Entier Nom : chaine[30] Prnom : chaine[20] Fin Etudiant TAB : Tableau de 10 Etudiant Var ET : TAB n : Entier Procdure Remplissage(m : Entier ; var T : TAB) Var i : Entier Dbut Pour i de 1 m faire Ecrire("Etudiant n",i," :") Ecrire("Identifiant : "),Lire(T[i].Ident) Ecrire("Nom : "),Lire(T[i].Nom) Ecrire("Prnom : "),Lire(T[i].Prnom) Fin Pour Fin Procdure Affichage(m : Entier ; var T : TAB) Var i : Entier Dbut Ecrire("Identifiant Nom Prnom : ") Ecrire("-------------------------------------------------") Pour i de 1 n faire Ecrire(T[i].Ident," ",Lire(T[i].Nom," ",T[i].Prnom) Fin Pour Fin {Programme principal} Dbut n 10 Remplissage(n,ET) Affichage(n,ET) Fin

Page 5 sur 53

EXERCICE N2
Algorithme GesEtud Type Notes : Enregistrement noteCc : Rel noteEx : Rel Fin Notes Etudiant : Enregistrement Ident : Entier Nom : chaine[30] Prnom : chaine[20] Note : Notes Fin Etudiant TAB : Tableau de 10 Etudiant Var ET : TAB n : Entier Procdure SaisiNotes(var E : Etudiant) Var noteEntrer : Rel Dbut Rpter Ecrire("Note contrle contenu : "),Lire(noteEntrer) Jusqu noteEntrer 0 ET noteEntrer 20 E.Note.NoteCc noteEnter Rpter Ecrire("Note examen : "), Lire(noteEntrer) Jusqu noteEntrer 0 ET noteEntrer 20 E.Note.NoteEx noteEnter Fin Procdure Remplissage(m : Entier ; var T : TAB) Var i : Entier Dbut Pour i de 1 m faire Ecrire("Etudiant n",i," :") Ecrire("Identifiant : "),Lire(T[i].Ident) Ecrire("Nom : "),Lire(T[i].Nom) Ecrire("Prnom : "),Lire(T[i].Prnom) SaisiNotes(T[i]) Fin Pour Fin

Page 6 sur 53

Procdure AfficheNotes(E : Etudiant) Dbut Ecrire("Note Contle Contenu Note Examen ") Ecrire("------------------------------------") Ecrire(E.Note.NoteCc," ",E.Note.NoteEx) Fin Procdure Affichage(m : Entier ; T : TAB) Var i : Entier Dbut Ecrire("Identifiant Nom Prnom : ") Ecrire("-------------------------------------------------") Pour i de 1 n faire Ecrire(T[i].Ident," ",Lire(T[i].Nom," ",T[i].Prnom) AfficheNotes(T[i]) Fin Pour Fin Fonction MeilleureNote(m : Entier ; T : TAB) : Rel Var i : Entier NoteMax : Rel Dbut NoteMax T[1].Note.NoteEx Pour i de 2 m Faire Si T[i].Note.NoteEx > NoteMax Alors NoteMax T[i].Note.NoteEx Fin Si Fin Pour MeilleureNote NoteMax Fin Fonction MoyenneGnrale(m : Entier ; T : TAB) : Rel Var i : Entier som : Rel Dbut som 0 Pour i de 2 m Faire som som + 0.3 x T[i].Note.noteCc + 0.7 x T[i].Note.noteEx Fin Pour MoyenneGnrale som / m Fin
{Programme principal}

Dbut n 10 Remplissage(n,ET) Affichage(n,ET) Ecrire("Meilleur note examen :", MeilleureNote(n,ET), " Moyenne gnrale de la classe :", MoyenneGnrale(n,ET)) Fin Page 7 sur 53

EXERCICE N3
Algorithme TraiTFichNom Type Nom : chaine[30] FichNoms : Fichier de Nom Var F1,F2 : FichNoms Procdure Cration(Var fn : FichNoms) Var n : Nom rep : caractre Dbut Ouvrir(fn,E) //ouverture du fichier en criture rep O Tant que MAJUS(rep) = O Faire Ecrire(Nom : ), Lire(n) Ecrire(fn,n) Ecrire(Voulez-vous ajouter un autre nom (O/N) : ) Lire(rep) Fin Tant que Fermer(fn) //fermeture du fichier Fin Procdure Affichage(fn : FichNoms) var n : Nom Dbut Ouvrir(fn,L) Lire(fn,n) Tant que NON(FinDeFichier(fn)) Faire Ecrire(n) Lire(fn,n) Fin Tant que Fermer(fn) Fin Fonction Recherche(x : Nom ; fn : FichNoms) : Boolen var n : Nom Trouve : Boolen Dbut Ouvrir(fn,L) Lire(fn,n) Trouve (n = x) Tant que Trouve=faux ET NON(FinDeFichier(fn)) Faire Lire(fn,n) Trouve (n = x) Fin Tant que Si FinDeFichier(fn) Alors Recherche faux Sinon Recherche vrai Fin Si Fermer(fn) Fin Page 8 sur 53

Procdure Copier(x : Nom ; fn : FichNoms ; var ft : FichNoms) var n : Nom Dbut Ouvrir(fn,L) Ouvrir(ft,E) //copie du fichier source vers le fichier de destination Lire(fn,n) Tant que n x ET NON(FinDeFichier(fn)) Faire Ecrire(ft,n) Lire(fn,n) Fin Tant que Si NON(FinDeFichier(fn)) Alors Lire(fn,n) //copie du reste du fichier Tant que NON(FinDeFichier(fn)) Faire Ecrire(ft,n) Lire(fn,n) Fin Tant que Fin Si Fermer(fn) Fermer(ft) Fin
{Programme principal}

Dbut Cration(F1) Affichage(F1) Si Recherche("Riadh",F1) Alors Ecrire("Riadh est existant dans le fichier") Sinon Ecrire("Riadh est non existant dans le fichier") Fin Si Copier("Riadh",F1,F2) Affichage(F2) Fin

EXERCICE N4
Algorithme GesEtudFichier Type Notes : Enregistrement noteCc : Rel noteEx : Rel Fin Notes Etudiant : Enregistrement Ident : Entier Nom : chaine[30] Prnom : chaine[20] Note : Notes Fin Etudiant TAB : Tableau de 100 Etudiant FichEtud : Fichier de Etudiant

Page 9 sur 53

Var Fe,Fr : FichEtud Procdure SaisiNotes(var E : Etudiant) Var noteEntrer : Rel Dbut Rpter Ecrire("Note contrle contenu : "),Lire(noteEntrer) Jusqu noteEntrer 0 ET noteEntrer 20 E.Note.NoteCc noteEnter Rpter Ecrire("Note examen : "), Lire(noteEntrer) Jusqu noteEntrer 0 ET noteEntrer 20 E.Note.NoteEx noteEnter Fin Procdure Cration(var fn : FichEtud ) Var Et : Etudiant rep : caractre Dbut Ouvrir(fn,E) //ouverture du fichier en criture rep O Tant que MAJUS(rep) = O Faire Ecrire("Identifiant : "),Lire(Et.Ident) Ecrire("Nom : "),Lire(Et.Nom) Ecrire("Prnom : "),Lire(Et.Prnom) SaisiNotes(Et) Ecrire(fn,Et) Ecrire(Voulez-vous ajouter un autre nom (O/N) : ) Lire(rep) Fin Tant que Fermer(fn) //fermeture du fichier Fin Procdure CopierDansTab(fn :FichEtud; var n:Entier ;var T : TAB ) var Et : Etudiant Moy : Rel Dbut Ouvrir(fn,L) Lire(fn,Et) n 0 Tant que NON(FinDeFichier(fn)) Faire Moy 0.3 x Et.Note.noteCc + 0.7 x Et.Note.noteEx Si Moy 10 Alors n n + 1 // incrmentation de la taille T[n] Et // affectation de lenregistrement au tableau Fin Si Lire(fn,Et) Fin Tant que Fermer(fn) Fin

Page 10 sur 53

Procdure TriBulle( n : Entier ; var T :TAB) Var i : Entier aux : Etudiant rep : Boolen moy 1,moy2: Rel Dbut Rpter rep faux Pour i de 1 n Faire moy1 0.3 x T[i].Note.noteCc + 0.7 x T[i] moy2 0.3 x T[i+1].Note.noteCc + 0.7 x T[i+1] Si moy1 < moy2 Alors aux T[i] T[i] T[i+1] T[i+1] aux rep vrai Fin Si Fin Pour n n + 1 Jusqu rep = faux OU n =1 Fin Procdure Rsultat(fn :FichEtud; var fr : FichEtud) Var i,n : Entier T : TAB Dbut CopierDansTab(fn,n,T) TriBulle(n,T) //Tri dans lordre dcroissant Ouvrir(fr,E) // Ouverture du fichier rsultat en criture Pour i de 1 n Faire Ecrire(fr,T[i]) Fin Pour Fermer(fr) //fermeture du fichier Fin Procdure Affichage(fr : FichNoms) var Et : Etudiant Moy : Rel Dbut Ouvrir(fr,L) Lire(fr,Et) Tant que NON(FinDeFichier(fr)) Faire Moy 0.3 x Et.Note.noteCc + 0.7 x Et.Note.noteEx Ecrire(Et.Ident, ,Et.Nom, ,Et.Prnom, ,Moy) Lire(fr,Et) Fin Tant que Fermer(fr) Fin

{Programme principal} Dbut Cration(Fn) Affichage(Fn) Rsultat(Fn,Fr) Affichage(Fr) Fin

Page 11 sur 53

Anne Universitaire : 2008/2009 Semestre 2


Module : Algorithmique et structures de donnes II Classe : 1re anne LFIAG Facult des Sciences Juridiques, Economiques et de Gestion de Jendouba

Charg de cours : Riadh IMED FEREH Charg de TD : Riadh BOUSLIMI

TD n 2(Rcursivit) (Rcursivit)
Objectifs
Rsoudre des programmes rcursifs. Comprendre la dmarche de transformation dun programme itrative en un programme rcursive. Savoir les avantages de lutilisation de la rcursivit pour rsoudre les problmes.

EXERCICE N1 crire une fonction rcursive qui retourn la somme des chiffres dun entier N donn. Exemple :( 123 == > 1 + 2 + 3 = 6 ) EXERCICE N2 crire une fonction rcursive qui calcul la factorielle dun entier N positif. Exemple : ( 5 ! = 5 x 4 x 3 x 2 x 1 = 120) EXERCICE N3 crire une fonction rcursive qui permet de dterminer si un entier N saisi au clavier est premier ou pas. (Un nombre premier nest divisible que par 1 ou lui-mme). EXERCICE N4 crire une procdure rcursive qui permet dinverser une chaine de caractres sans utiliser une chaine temporaire. Exemple : information EXERCICE N5 crire une fonction rcursive qui permet de vrifier si deux chaines s1 et s2 sont anagrammes ou non. s1 et s2 sont anagrammes sils se composent de mme lettre. Exemple : s1 = "chien" ; s2 = "niche" EXERCICE N6 crire une fonction rcursive qui permet de vrifier si un mot planch en paramtre est palindrome ou non. Exemples : mot = "aziza" vrai ; mot = "alga" faux vrai noitamrofni

Page 12 sur 53

EXERCICE N7 crire une fonction rcursive nomme Rech_seq qui permet de chercher un entier x dans un tableau T de n entiers selon le principe de la recherche squentielle. crire une fonction rcursive nomme Rech_dico qui permet de chercher un entier x dans un tableau T de n entiers selon le principe de la recherche dichotomique. EXERCICE N8 crire une procdure rcursive indirecte nomm Tri_Bulle qui permet de trier un tableau T de n entiers. Utiliser les deux procdures ci-dessous :
Procdure Permuter(var x, y : Entier) Procdure Parcours (i,n :Entier ; var rep : Boolen ; var T :TAB)

NB : rep elle est utilise pour renvoy sil ya eu une permutation au cours du parcours du tableau. EXERCICE N9 crire une procdure rcursive nomme Anagramme qui permet dafficher tous les anagramme dune chaine ch. NB : Utiliser une permutation circulaire pour rsoudre ce problme. Exemple :ch="iag" Les anagrammes de iag sont :
1) 2) 3) 4) 5) 6) aig agi gai gia iga iag

EXERCICE N10 crire un programme rcursif permettant de dessiner une pyramide dtoiles selon un entier n donn, avec n un nombre impair. Exemple : n=9 * *** ***** ******* ********* *********** ************* *************** ***************** .

Page 13 sur 53

Correction du TD n2
EXERCICE N1
Fonction Somme(n :Entier) : Entier Var s : Entier Dbut Si n>0 Alors s s + n MOD 10 Somme Somme(n DIV 10) Fin Si Somme s Fin

EXERCICE N2
Fonction Factorielle (n :Entier) : Entier Var fac : Entier Dbut Si n>0 Alors fac fac + n Factorielle Factorielle(n - 1) Fin Si Factorielle fac Fin

EXERCICE N3
Fonction Premier (d, n :Entier) : Entier Dbut Si d ((N DIV 2)+1) Alors Si n MOD d 0 Alors Premier Premier(d+1, n) Sinon Premier vrai Fin Si Sinon Premier faux Fin Si Fin

Page 14 sur 53

EXERCICE N4
Procdure Inverse (var ch : chaine) Var c : caractre Dbut Si ch = "" Alors Inverse "" Sinon c ch[LONG(ch)] Effacer(ch,long(ch),1) Inverse(ch) ch c + ch Fin Si Fin

//Si la chaine ch est vide on sarrte

// rcupration du dernier caractre // Effacer le dernier caractre // Inverser la nouvelle chaine ch // Concatnation

EXERCICE N5
Fonction Anagramme (var s1, s2 : chaine) : Boolen Var c : caractre Dbut Si LONG(s1) LONG(s2)Alors Anagramme faux Sinon Si LONG(s1) = LONG(s2) = 0 Alors Anagramme vrai Sinon p = POS(s1[1],s2) // retourne la position du 1ercaractre Si p = 0 Alors Anagramme faux Sinon EFFACER(s1,1,1) //Effacer le 1er caractre de s1 EFFACER(s2,p,1) //Effacer le pme caractre de s2 Anagramme Angramme(s1,s2) Fin Si Fin Si Fin Si Fin
// dans la chaine de caractre s2 // si non trouv

Page 15 sur 53

EXERCICE N6
Function Palindrome (mot : chaine) : Boolen Var c : caractre Dbut Si mot= "" Alors //Si la chaine ch est vide on sarrte Palindrome Vrai Sinon Si mot[1] = mot[LONG(mot)] Alors EFFACER(mot,1,1) //Effacer le premier caractre EFFACER(mot,LONG(mot),1) //Effacer le dernier caractre Palindrome Palindrome(mot) Sinon Palindrome faux Fin Si Fin Si Fin

EXERCICE N7
Function Rech_seq(i, n, x : Entier ; T : TAB) : Boolen Dbut Si i n Alors Si T[i] = x Alors Rech_seq Vrai Sinon Rech_seq Rech_seq(i+1,n,x,T) Fin Si Sinon Rech_seq Faux Fin Si Fin Function Rech_dico(g, d, x : Entier ; T : TAB) : Boolen Var m : Entier Dbut Si g>d Alors Rech_dico faux Sinon m (d + g) DIV 2 Si T[m] = x Alors Rech_dico Vrai Sinon Si T[m]>x Alors Rech_dico Rech_dico(g,m-1,x,T) Sinon Rech_dico Rech_dico(m+1,d,x,T) Fin Si Fin Si Fin Page 16 sur 53

EXERCICE N8
Procdure Permuter(var x, y : Entier) Var Aux : Entier Dbut aux x x y y aux Fin

Procdure Parcours(i,n :Entier ; var rep : Boolen ; var T :TAB) Dbut Si i<n Alors Si T[i] >T[i+1] Alors Permuter(T[i],T[i+1]) rep Vrai Fin Si Fin Si Fin Procdure TriBulle(n : Entier ;Perm : Boolen var T :TAB) Var Perm : Boolen Dbut
//Sil na pas eu de permutation et n>1 on recommence //le parcours si non on arrte le traitement

Si ((n>1) ET (Perm = vrai)) Alors Perm Faux Parcours(1,n,Perm,T) TriBulle(n-1,Perm,T) Fin Si Fin

EXERCICE N9
Procdure PermutCirc(var ch :chaine) Dbut
//Si la longueur de la chaine est plus quun caractre

Si LONG(ch)>1 Alors
//concatnation du dernier caractre avec le reste de la chaine

Ch Fin Si Fin

ch[LONG(ch)] + SOUS-CHAINE(ch,2,LONG(ch)-1)

Page 17 sur 53

Procdure Anagramme(s : chaine ; c : Entier ; var l : Entier) Var i : Entier tete, queue : chaine Dbut Pour i de 1 LONG(s) - c tete SOUS-CHAINE(s, 1, c) queue SOUS-CHAINE(s, c+1, LONG(s)-c) s = tete + PermutCirc(queue) Si c = LONG(s) - 1 Alors l l + 1 Ecrire(l,")",s) Sinon Anagramme(s, c + 1, l) Fin Si Fin Pour Fin

Trace dexcution
Anagramme("iag",0,0) Anagramme("agi",0,2) i=1 s="iag" c=0 tete "" queue "iag" s "agi" c 0 = 3-1 Faux Anagramme("agi",1,0) Anagramme("aig",1,1) i=1 s="agi" i=1 Dpilement c=1 s="aig" Dpilement tete "a" c=1 queue "gi" tete "a" s "aig" queue "ig" c 1 = 3-1 Faux s "agi" Anagramme("aig",2,0) c 1 = 3-1 Faux i=1 Anagramme("agi",2,1) s="aig" i=1 Empilement Empilement c=2 s="agi" tete "ai" c=2 queue "g"tete "ag" s "aig" queue "i" c 2 = 3-1 Vrai s "agi" l 1c 2=3-1 Vrai

1)aigl 2 2)agi

Page 18 sur 53

EXERCICE N10
h

Algorithme Pyramide Var n : Entier

//variable globale

Fonction Saisie() : Entier Var m : Entier Dbut Ecrire("Entrer un nombre impair :") Lire(m) Si m MOD 2=0 Alors Saisie Saisie() Sinon Saisie m Fin Si Fin

Procdure Espace(i :Entier) Dbut Si i>=1 Alors Ecrire(" ") Etoile(i-1) //appel rcursive Fin Si Fin Procdure Etoile(j :Entier) Dbut Si j>=1 Alors Ecrire(" ") Etoile(j-1) //appel rcursive Fin Si Fin Procdure Dessiner(k , m :Entier) Dbut Si k<=m Alors Espace(m-k) // criture des espaces au dbut de la ligne Etoile(k) // criture des toiles au dbut de la ligne Etoile(k-1) // criture des toiles la fin de la ligne Ecrire("\n") // retour la ligne Fin Si Fin {Programme principal} Dbut
n Saisie()

Dessiner(1,n) Fin

//appel de la fonction rcursive qui permet de saisir n // appel de la procdure rcursive qui va dessiner le pyramide

Page 19 sur 53

Anne Universitaire : 2008/2009 Semestre 2


Module : Algorithmique et structures de donnes II Classe : 1re anne LFIAG Facult des Sciences Juridiques, Economiques et de Gestion de Jendouba

Charg de cours : Riadh IMED FEREH Charg de TD : Riadh BOUSLIMI

TD n 3 (Les Listes chaines) (Les Listes chaines)


Objectifs :
Savoir dclarer, construire des listes chaines. Manipuler, traiter et apprendre utiliser des listes chaines. Distinguer entre les diffrents types de listes chaines.

QUESTIONS DE COURS 1) Quest-ce quun pointeur ? 2) Quelle est la diffrence entre une structure de donnes statique et une structure de donnes dynamique ? EXERCICE N1 (RAPPEL DU COURS) 1) Dfinir une liste simple chaine compos dune valeur entire et dun pointeur vers llment suivant ; 2) Dclarer une variable de ce type dfini dans la question 1) ; 3) crire une procdure permettant de crer une liste chaine de n entiers.
Procdure CrerListe(n : Entier ; var L : Liste)

4) crire deux procdures lune itrative et lautre rcursive permettant dafficher les lments de la liste.
Procdure AffichageIter(L : Liste) Procdure AffichageRecu(L : Liste)

5) crire une fonction rcursive qui permet de rechercher un lment x dans la liste.
Fonction Recherche(x : Entier ; L : Liste) : Boolen

6) crire une procdure qui permet dajouter une tte de la liste.


Procdure AjouterTete(x : Entier ; var L : Liste)

7) crire une procdure qui supprimer un lment de la liste.


Procdure Supprimer(x : Entier ; var L : Liste)

EXERCICE N2 crire une procdure nomme Inverse qui permet dinverser une liste sans utiliser un variable temporaire. EXERCICE N3 crire une procdure nomme TriBulle qui permet de trier une liste chaine selon le principe de tri bulle. EXERCICE N4 crire une procdure qui permet de concatner deux listes chaines L1 et L2 dentiers dans une troisime liste L3. Il faut traiter toutes les contraintes possibles.
Page 20 sur 53

EXERCICE N5 On dispose de deux listes L1 et L2 tris qui sont tris dans lordre croissant. crire une procdure fusion qui permet de fusionner deux listes L1 et L2 dans la liste L1. EXERCICE N6 crire une procdure qui permet de supprimer les doublons dans une liste chaine trie dans lordre croissant qui contient des caractres alphabtiques. Comment peut-on liminer les doublons si la liste ntait pas trie ? EXERCICE N7 crire une fonction qui permet de vrifier si une liste est palindrome ou non. Exemple : A Z Cette liste est palindrome O X Cette liste nest pas palindrome EXERCICE N8 Une liste doublement chane est une liste qui admet, en plus de permettre l'accs au suivant d'un lment, permet l'accs au prcdent d'un lment. Quel est l'intrt de ce type de liste par rapport aux listes simplement chanes ? crivez les fonctions et procdures suivantes en mettant ventuellement jour les primitives prcdentes :
1. Fonction premier(L :Liste) : Liste renvoie le premier lment de L. 2. Fonction dernier(L : Liste) : Liste renvoie le dernier lment de L. Proposer deux solutions lune en connaissant la queue de la liste et la deuxime en ne connaissant pas cette dernire. 3. Fonction estVide(L : Liste) : Boolen renvoie vrai si la liste est vide et faux sinon. 4. Procdure supprimerPremier(var L : Liste) supprime le premier lment de L. 5. Procdure ajouterAprs(P, Q : Liste ; var L : Liste) ajoute P dans L aprs Q. 6. Procdure supprimer(x : Entier ; var L : Liste) supprime x dans L.

EXERCICE N9 1. crire la procdure AjouterTete qui permet dajouter au dbut dune liste circulaire L un entier e. 2. crire la procdure AjouterFin qui permet dajouter la fin dune liste circulaire Lun entier e. 3. crire une procdure Affiche qui affiche la liste circulaire qui lui est passe en argument.

Page 21 sur 53

Correction du TD n3
QUESTIONS DE COURS 1) Quest-ce quun pointeur ?
R : Un pointeur P est une variable statique dont les valeurs sont des adresses.

2) Quelle est la diffrence entre une structure de donnes statique et une structure de donnes dynamique ?
R : La diffrence entre une structure de donnes statique et une structure de donnes dynamique est la taille, la premire est dfinie au dbut en spcifiant la taille qui est fixe, par contre pour la deuxime la taille est variable et qui est base sur lallocation dynamique.

EXERCICE N1 (RAPPEL DU COURS) 1)


Type Liste : ^cellule Cellule : Enregistrement val : Entier

suiv : Liste Fin Cellule

2)

Var L : Liste

3)

Procdure CrerListe(n : Entier ; var L : Liste) Var Tete, p : Liste i : Entier Dbut Allouer(Tete) Ecrire("Entrer lment Tte :") Lire(Tete^.val) Tete^.suiv nil L Tete Pour i de 2 n faire Allouer(p) Ecrire("Entrer lment n :",i) Lire(p^.val) p^.suiv nil L^.suiv p L p Fin Pour L Tete //se pointer sur la tte de la liste Fin

Page 22 sur 53

4)
Procdure AffichageIter(L : Liste) Var p : Liste Dbut p L Tant que p nil Faire Ecrire(p^.val) p p^.suiv Fin Tant que Fin Procdure AffichageRecu(L : Liste) Dbut Si L nil Alors Ecrire(p^.val) AffichageRecu(p^.suiv) Fin Si Fin

5)

Version itrative

Fonction Recherche(x : Entier ; L : Liste) : Boolen Var p : Liste Dbut p L Tant que ((p nil) ET (p^.val x)) Faire p p^.suiv Fin Tant que Si p = nil Alors Recherche Faux Sinon Recherche Vrai Fin Si Fin
Version rcursive

Fonction Recherche(x : Entier ; L : Liste) : Boolen Dbut Si L = nil Alors Recherche Faux Sinon Si L^.val = x Alors Recherche Vrai Sinon Recherche Recherche(x, L^.suiv) Fin Si Fin Si Fin

Page 23 sur 53

6)
Procdure AjouterTete(x : Entier ; var L : Liste) Var Tete : Liste Dbut Allouer(Tete) Tete^.val x Tete^.suiv L L Tete Fin

7)

Version itrative

Procdure Supprimer(x : Entier ; var L : Liste) Var P,Q : Liste Dbut Si L = nil Alors
Ecrire("Liste vide, impossible de supprimer ",x)

Sinon SiL^.val = x Alors P L //mmorisation de llment supprimer L L^.suiv Sinon P L^.suiv Tant que ((P nil) ET (P^.val x)) Faire Q P P P^.suiv Fin Tant que Si P nil Alors Q^.suiv P^.suiv Librer(P) Fin Si Fin Si Fin Si Fin
Version rcursive

Procdure Supprimer(x : Entier ; var L : Liste) Var P : Liste Dbut Si L nilAlors Si L^.val = x Alors P L L L^.suiv Librer(P) Sinon Supprimer(x, L^.Suiv) FinSi FinSi Fin Page 24 sur 53

EXERCICE N2
Procdure Inverse (var L : Liste) Var P,Q : Liste Dbut P nil Tant que L nil Faire Q L^.suiv L^.suiv P P L L Q Fin Tant que Fin Trace dexcution de lexemple ci-dessous

15 15 7 9 10 12 EXERCICE N3

10

12

15 7 9 10

15 7 9

15 7

15

Procdure TriBulle(var L : Liste) Var P, Q : Liste Temp : Entier Dbut P L Q L^.suiv Rpter rep faux P L // pointeur sr le premier lment Q L^.suiv // pointeur sur le deuxime lment Tant que Q nil Faire Si P^.val>Q^.val Alors Temp P^.val Permutation P^.val Q^.val Q^.val Temp rep vrai Fin Si Fin tant que Jusqu rep = faux Fin

Page 25 sur 53

EXERCICE N4
Procdure Concatener(L1,L2 : Liste ; var L3 : Liste) Dbut Si L1 = nil ET L2 = nil Alors L3 nil Sinon Si L1 nil ET L2 = nil Alors L3 L1 Sinon Si L1 = nil ET L2 nil Alors L3 L2 Sinon //affectation de la premire liste L1 L3 L1 //se pointer sur le dernier lment de L3 Tant que L3^.suiv nil Faire L3 L3^.suiv Fin Tant que //affectation de la liste L2 la fin de L3 L3^.suiv L2 //se pointer sur la tte de la liste L3 L1 Fin Si Fin

EXERCICE N5
Procdure Fusion(var L1 :Liste ; L2 : Liste) Var Tete, P, Q : Liste Dbut Si L1 = nil Alors //Si L1 et vide L1 L2 Sinon Si L2 nilAlors
//Fixation de la position de la tte de la liste

Si L1^.val L2^.val Alors Tete L1 Sinon Tete L2 Fin Si Q Tete //mmorisation de llment prcdent Tant que L1 nil ET L2 nil Faire Si L1^.val > L2^.val Alors P L2 L2 L2^.suiv Q^.suiv P P^.suiv L1 Q P

Page 26 sur 53

Sinon Si L1^.val > L2^.val Alors P L2 L2 L2^.suiv Q L1 L1 L1^.suiv Q^.suiv P P^.suiv L1 Sinon Q L1 //mmorisation de llment prcdent L1 L1^.suiv Fin Si Fin Tant que L1 Tete //pointer L1 la tte de la liste Fin Si Fin Si Fin

EXERCICE N6
Procdure SupprimeDoublons(var L :Liste) Var Q , P : Liste Dbut Q L Si L nilAlors Tant que Q^.suiv nilFaire P Q Q Q^.suiv Si Q^.val = P^.valAlors //on supprime de L l'lment point par Q. Q^.suiv P^.suiv Librer(P) Fin Si Fin Tant que Fin Si Fin Procdure SupprimeDoublons(var L :Liste) Var Q : Liste Vpred : caractre Dbut Q L Si L nilAlors Tant que Q^.suiv nilFaire Vpred Q^.val Q Q^.suiv Si Q^.val = Vpred Alors Supprimer(Vpred,Q) Fin Si Fin Tant que Fin Si Fin

Liste trie

Liste non trie

Cette procdure se charge de parcourir la liste Q en supprimant toutes les valeurs de Vpred

Page 27 sur 53

EXERCICE N7
Fonction Palindrome(L : Liste) :Boolen Var Stop : Boolen Deb, Fin, Q : Liste Dbut Deb L // Pointeur sur le premier lment Fin nil // Pointeur sur le dernier lment Stop faux // Signale linterruption du traitement Tant que Deb^.suiv FinETNON(Stop) Faire
// Rcuprer le pointeur sur le dernier lment de la liste

Q P Tant que Q^.suiv FinFaire Q Q^.suiv Fin Tant que Si P^.val = Q^.val Alors Fin Q //se pointer sur le dernier lment de la liste L Sinon Stop vrai // arrt du traitement Fin Si Si Deb Fin Alors Deb Deb ^.suiv Fin Si Fin Tant que Palindrome NON(Stop) Fin

EXERCICE N8 Lintrt dune liste doublement chaine par rapport une liste chaine simple cest pour acclrer la recherche dun lment.
E1

E2 Tte E3 Type Liste : ^cellule Cellule : Enregistrement pred : Liste val : Entier suiv : Liste Fin Cellule Var L : Liste

Queue

Page 28 sur 53

1)

Fonction Premier(L : Liste) : Liste Dbut Si L nullAlors Premier L Sinon Premier nil Fin Si Fin

2)

Solution n 1 : On connaisse la queue de la liste


Fonction Dernier(Queue : Liste) : Liste Dbut Dernier Queue Fin

Solution n 2 : On ne connaisse pas la queue de la liste


Fonction Dernier(L : Liste) : Liste Var P : Liste Dbut P L Tant que P^.suiv nullFaire P P^.suiv Fin Tant que Dernier P Fin

3) Fonction estVide(L : Liste) : Boolen Dbut Si L = nilAlors estVide vrai Sinon estVide faux Fin Si Fin

4)

Procdure supprimerPremier(var L : Liste) Var P : Liste Dbut Si L nilAlors P L L L^.suiv L^.pred nil Librer(P) Fin Si Fin

Page 29 sur 53

5)

Procdure ajouterAprs(P,Q : Liste ; var L : Liste) Var D :Liste Dbut D L Tant queD Q ETD nilFaire D D^.suiv Fin Tant que Si D = Q Alors D D^.suiv D^.pred p P^.suiv D Q^.suiv P P^.pred Q Sinon Ecrire("Ajout impossible, lment non existant") Fin Si Fin Procdure Supprimer(x : Entier ; var L : Liste) Var P,Q,D : Liste Dbut Si L = nil Alors
Ecrire("Liste vide, impossible de supprimer ",x)

6)

Sinon Si L^.val P L Sinon P Tant = x Alors L L^.suiv

L^.suiv que ((P nil) ET (P^.val x)) Faire Q P P P^.suiv Fin Tant que Si P nil Alors D P^.suiv D^.pred Q Q^.suiv D Librer(P) Fin Si Fin Si Fin Si Fin

Page 30 sur 53

EXERCICE N9
E1

E2 Tte E3

Une liste circulaire est une structure de donnes dynamique dont le dernier lment de la liste pointe sur la tte de la liste.
Procdure AjouterTte(e : Entier ; var L : Liste) Var N,Tete,Queue: Liste Dbut Allouer(N) N^.val e Si L = nilAlors L N N^.suiv L L^.suiv N Sinon Tete L Queue L Tant que Queue^.suiv TeteFaire Queue Queue^.suiv Fin Tant que Queue^.suiv N N^.suiv Tete Tete N L Tete Fin Si Fin

Remarque : ajouter au dbut ou la fin dune liste chaine circulaire, cest dappliquer le mme algorithme que celui dajouter tte de liste.

Page 31 sur 53

Procdure affiche(L : Liste) Var P :Liste Dbut Si L = nil Alors Ecrire("Liste vide") Sinon P L//Tte de la liste // Tant que la Queue de la liste est diffrente de la Tte de la liste Tant que P^.suiv P Faire Ecrire(P^.val) P P^.suiv Fin Tant que Fin Si Fin

Page 32 sur 53

Anne Universitaire : 2008/2009 Semestre 2


Module : Algorithmique et structures de donnes II Classe : 1re anne LFIAG Facult des Sciences Juridiques, Economiques et de Gestion de Jendouba

Charg de cours : Riadh IMED FEREH Charg de TD : Riadh BOUSLIMI

TD n 4(Les piles et les files)


(Les piles et les files) Objectifs
Dfinir et manipuler une pile et une file Savoir diffrencier entre la structure dune pile et la structure de celle dune file.

EXERCICE N1(LES PILES) 1) Rappeler la dfinition dune pile et donner les contraintes daccs cette dernire. 2) Crer la structure dune pile. 3) Dfinir une variable quelconque de type pile. 4) crire la procdure InitialiserPile(var P : Pile) qui permet de crer une pile vide. 5) crire la fonction EstPileVide(P : Pile) :Boolen qui permet de vrifier si une pile est vide. 6) crire la procdure Empiler(x : Entier ; var P : Pile) qui permet dajouter llment x au sommet de la pile. 7) crire la procdure Dpiler(var x : Entier ; var P : Pile) qui permet de supprimer le sommet de la pile et de le mettre la valeur dans la variable x. EXERCICE N2(LES FILES) 1) Quest-ce quune file. Prsenter un graphe illustrant laccs cette dernire. 2) Crer la structure dune file. 3) Dfinir une variable quelconque de type file. 4) crire la procdure InitialiserFile(var F : File) qui permet de crer une file vide. 5) crire la fonction EstFileVide(F : File) qui permet de vrifier si une file est vide. 6) crire la procdure Enfiler(x : Entier ; var F : File) qui permet dajouter llment x au sommet de la file. 7) crire la procdure Dfiler(var x : Entier ; var F : File) qui permet de supprimer le sommet de la file et de le mettre la valeur dans la variable x.

Page 33 sur 53

Correction du TD n4
EXERCICE N1(LES PILES) 1) Une pile est une structure de donnes dynamique (liste chane) dont linsertion et la suppression dun lment se font toujours en tte de liste. On peut rsumer les contraintes daccs par le principe dernier arriv, premier sorti qui se traduit en anglais par : Last In First Out. 2)
Type Pile : ^cellule cellule : Enregistrement val : Entier suiv : Pile Fin cellule

3)

Var P : Pile

4)

Procdure InitialiserPile(var P : Pile) Dbut P nil Fin


Fonction EstPileVide(P : Pile) : Boolen Dbut Si P = nil Alors EstPileVide vrai Sinon EstPileVide faux Fin Si Fin Procdure Empiler(x : Entier ; var P : Pile) Var Nv : Pile Dbut Allouer(Nv) Nv^.val x Nv^.suiv P P Nv Fin Procdure Dpiler(var x : Entier ; var P : Pile) Var S : Pile Dbut Si NON(EstPileVide(P)) Alors S P x P^.val P P^.suiv Librer(S) Fin Si Fin

5)

6)

7)

Page 34 sur 53

EXERCICE N2(LES FILES) 1) Une file est une structure de donnes dynamique (liste chane) dont les contraintes daccs sont dfinies comme suit : On ne peut ajouter un lment quen dernier rang de la suite. On ne peut supprimer que le premier lment. On peut rsumer les contraintes daccs par le principe premier arriv, premier sorti qui se traduit en anglais par : Fast In First Out . 2)
Type Liste : ^cellule cellule : Enregistrement val : Entier suiv : Liste Fin cellule File : Enregistrement Tte : Liste Queue : Liste Fin File

3)

Var F : File

4)

Procdure InitialiserFile(var F : File) Dbut F.Tte nil F.Queue nil Fin


Fonction EstFileVide(F : File) : Boolen Dbut Si F.Tte = nil Alors EstPileVide vrai Sinon EstPileVide faux Fin Si Fin Fonction Enfiler(x : Entier ; var F : File) var Nv : Liste Dbut Allouer(Nv) Nv^.val x Nv^.suiv nil Si F.Queue nil Alors F.Queue^.suiv Nv Sinon F.Tte Nv Fin Si F.Queue Nv Fin

5)

6)

Page 35 sur 53

7)
Procdure Dfiler(var B : Arbre ; var F : File) var P : Liste Dbut Si F.Tte nil Alors P F.Tte B P^.val F.Tte F.Tte^.suiv Librer(P) Fin Si Si F.Tte = nil Alors F.Queue nil Fin Si Fin

Page 36 sur 53

Anne Universitaire : 2008/2009 Semestre 2


Module : Algorithmique et structures de donnes II Classe : 1re anne LFIAG Facult des Sciences Juridiques, Economiques et de Gestion de Jendouba

Charg de cours : Riadh IMED FEREH Charg de TD : Riadh BOUSLIMI

TD n 5(Arbre binaire de recherche) (Arbre binaire de recherche)


Objectifs
Dfinir, crer et manipuler un arbre binaire de recherche. Savoir comment parcourir un arbre binaire de recherche ? Trouver un lment dans un arbre. Savoir passer dune structure dynamique dun arbre vers une structure statique reprsente par un vecteur. Savoir fusionner deux arbres. Connaitre les diffrents types darbres : dgnr, complet ou parfait.

EXERCICE N1(RAPPEL)
1) Dfinir un arbre binaire de recherche ? 2) Crer la structure dun arbre qui admet comme arguments une valeur entire, un pointeur vers le fils gauche et un pointeur vers le fils droit ; 3) Dclarer une variable de cette structure 2) ; 4) crire une procdure CrerElement(x : Entier ; var B : Arbre) qui permet de crer un lment x dans larbre. 5) Dessiner un arbre qui contient les valeurs qui suit : 14, 8, 4, 9, 3, 1, 20, 30, 25, 50. 6) crire une fonction EstVide(B :Arbre) : Boolen qui renvoie vrai si larbre est vide et faux si non. 7) crire une fonction EstUneFeuille(B :Arbre) : Boolen qui renvoie vrai si le sommet de larbre nadmet aucun fils et faux si non. 8) crire une fonction Recherche(x : Entier ; B : Arbre) : Boolen qui permet de chercher un lment x dans larbre et de renvoyer vrai si ce dernier est existant et faux si non. 9) crire et dessiner les graphes illustrant les diffrents types de parcours en profondeur vues en cours. 10) crire une procdure SupprimerElement(x : Entier ; var B : Arbre) supprimer un lment x de larbre. qui permet de

EXERCICE N2(LES MESURES)


1) crire une fonction qui calcule la taille dun arbre binaire. 2) crire une fonction qui calcule la hauteur dun arbre binaire. 3) crire une fonction qui calcule le nombre de nuds externes (feuilles) dun arbre binaire. 4) crire une fonction qui calcule le nombre de nuds internes dun arbre binaire. 5) crire une fonction qui calcule la longueur de cheminement externe dun arbre binaire. Page 37 sur 53

EXERCICE N3(PARCOURS EN LARGEUR) On souhaite parcourir et calculer la largeur dun arbre. Pour cela nous allons implmenter les sous-programmes suivants :
1) crire une procdure InitialiserFile(var F : File) qui permet dinitialiser la file dattente. 2) crire une fonction FileEstVide(F : File) : Boolen qui vrifier si la file dattente est vide. Elle renvoie vrai si cest le cas et faux sinon. 3) crire une procdure Enfiler(B : Arbre ; var F : File) qui permet dajouter un arbre la file dattente. 4) crire une procdure Dfiler(var B : Arbre ; var F : File) qui permet de renvoyer et supprimer le premier lment de la file dattente. 5) crire une procdure ParcoursEnLargeur(B : Arbre ; var n :Entier) qui permet de parcourir larbre en largeur et de renvoyer la largeur de ce dernier.

EXERCICE N4 (DU DYNAMIQUE VERS LE STATIQUE)

Figure 1 Arbre pour reprsentation hirarchique

crire une procdure qui construit un vecteur contenant les lments dun arbre binaire. Pour indiquer un arbre vide, il suffit de la reprsenter par le symbole . Par exemple, ci-dessous la reprsentation de larbre de la figure 1 : 1 22 2 8 3 35 4 4 5 14 6 23 7 8 2 9 5 10 11 15 12 13

EXERCICE N5 (ROTATIONS)

Figure 2 : Rotations gauche et droite

La figure ci-dessus montre un exemple de rotation de droite et une rotation gauche. On souhaite dans ce cas crer les deux procdures qui suivent :
Page 38 sur 53

1) Procdure rotation_droite( var B : Arbre) qui effectue une rotation droite et renvoie le nouvel arbre. 2) Procdure rotation_gauche(var B : Arbre) qui effectue une rotation gauche et renvoie le nouvel arbre.

EXERCICE N6 (COPIE) crire une procdure qui permet de copier un arbre binaire A dans un deuxime arbre B. EXERCICE N7 (FUSION) crire une procdure qui permet de fusionner deux arbres binaires A et B, et de renvoyer un arbre C qui contient les deux arbres. Discuter les diffrents cas possibles. EXERCICE N8 (DEGENERE, PARFAIT OU COMPLET) On dispose des deux fonctions hauteur et taille. On souhaite crire des fonctions qui permettent de vrifier si un arbre : 1. est dgnr : Un arbre dgnr est un arbre dont tous les nuds internes sont des points simples. Larbre B est dgnr si taille(B) = hauteur(B) + 1. a) crire la premire solution en utilisant les deux fonctions taille et hauteur. b) crire nouveau sans utiliser les deux fonctions taille et hauteur. 2. est complet : Un arbre dont tous les niveaux sont remplis est complet. Larbre B est complet si taille(B) = 2hauteur(B) + 1 1. a) crire la premire solution en utilisant la fonction hauteur. b) crire la deuxime solution sans utiliser la fonction hauteur. 3. est parfait : Un arbre est parfait si tous ses niveaux sont remplis, sauf le dernier dans lequel les feuilles sont ranges le plus gauche possible. crire une fonction permettant de vrifier si un arbre est parfait.

Page 39 sur 53

Correction du TD n5
EXERCICE N1 (RAPPEL DU COURS) 1) Quest-ce quun arbre binaire de recherche ? R : Un arbre binaire B est un ensemble de nuds qui est soit vide, soitcompos dune racine et de deux arbres binaires disjoints appels sous-arbre droit et sousarbre gauche.
Racine de larbre R

Hauteur de larbre

Nuds Internes de larbre

N F F F

N F

Feuilles de larbre

Largeur de larbre Un nud interne est un sommet qui a au moins un fils (gauche ou droit ou les deux). Une feuille est un sommet qui n'a pas de fils. La hauteur d'un sommet x est la longueur (en nombre d'arcs) du plus long chemin de x une feuille. La hauteur d'un arbre est gale la hauteur de la racine.

2)
Type Arbre : ^Nud Nud : Enregistrement Val : Entier FilsG : Arbre FilsD : Arbre Fin Nud

3)

Var A : Arbre

4)

Procdure CrerElement(x : Entier ; var B : Arbre) Dbut Si B = nilAlors Allouer(B) B^.val x B^.FilsG nil B^.FilsD nil Sinon Si B^.val> x Alors CrerElement(x, B^.FilsG) Fin Si Si B^.val< x Alors CrerElement(x, B^.FilsD) Fin Si Fin Si Fin

Page 40 sur 53

5)

1) Fonction EstVide(B :Arbre) : Boolen


Dbut Si B = nilAlors EstVide faux Sinon EstVide vrai Fin Si Fin

2)

Fonction EstUnFeuille(B :Arbre) : Boolen Dbut Si B^.FilsG = nil ET B^.FilsD = nil Alors EstUnFeuille vrai Sinon EstUnFeuille faux Fin Si Fin Fonction Recherche(x : Entier ; B : Arbre) : Boolen Dbut Si B=nil Alors Recherche faux Sinon Si B^.val = x Alors Recherche vrai Sinon Si B^.val> x Alors Recherche Recherche(x, B^.FilsG) Sinon Recherche Recherche(x, B^.FilsD) Fin Si Fin Si Fin

3)

4) 1. La premire stratgie de parcours dun arbre binaire de recherche est dite en profondeur dabord ou dans lordre prfix.

Page 41 sur 53

4 5

3 Rsultat : 15 10 5 12 30 20 37
Procdure ParcoursPrfixe(B : Arbre) Dbut Si B nilAlors Ecrire(B^.val) ParcoursPrfixe(B^.FilsG) ParcoursPrfixe(B^.FilsD) Fin Si Fin

2. La deuxime stratgie de parcours dun arbre binaire de recherche est dite : parcours de larbre dans lordre infixe ou symtrique . Le parcours donne des valeurs tries dans lordre croissant.

4 5 6

Rsultat :5 10 12 15 20 30 37
Procdure ParcoursInfix(B : Arbre) Dbut Si B nilAlors ParcoursInfix(B^.FilsG) Ecrire(B^.val) ParcoursInfix(B^.FilsD) Fin Si Fin

3. La troisime stratgie de parcours dun arbre binaire de recherche est dite : parcours de larbre dans lordre postfix .

Page 42 sur 53

3 2

Rsultat : 5 10 12 20 37 30 15
Procdure ParcoursPostfix(B : Arbre) Dbut Si B nilAlors ParcoursPostfix(B^.FilsG) ParcoursPostfix(B^.FilsD) Ecrire(B^.val) Fin Si Fin 5) Le principe de suppression doit obir aux constations suivantes : La suppression commence par la recherche de l'lment. Une fois trouv ce dernier : si c'est une feuille, on la vire sans problmes si c'est un sommet qui n'a qu'un fils, on le remplace par ce fils si c'est un sommet qui a deux fils, on a deux solutions : 1. le remplacer par le sommet de plus grande valeur dans le sous arbre gauche. 2. le remplacer par le sommet de plus petite valeur dans le sous arbre droit. Pour simplifier le travail nous allons commencer par crire deux fonctions : la premire renvoie llment qui a la plus grande valeur dans le sous arbre gauche ; la deuxime renvoie llment qui a la plus petite valeur dans le sous arbre droit. Fonction PlusPetitSousArbreDroit(B : Arbre) Dbut Si B^.FilsG nil Alors
PlusPetitSousArbreDroit PlusPetitSousArbreDroit(B^.FilsG)

Sinon
PlusPetitSousArbreDroit

Fin Si Fin

Fonction PlusGrandSousArbreGauche(B : Arbre) Dbut Si B^.FilsD nil Alors


PlusGrandSousArbreGauche PlusGrandSousArbreGauche(B^.FilsD)

Sinon
PlusGrandSousArbreGauche

Fin Si Fin

Page 43 sur 53

Procdure Supprimer(x : Entier ; var B : Arbre) Var P, Q : Arbre Dbut Si B = nil Alors Ecrire ("Arbre vide ", x, " est introuvable") Sinon Si B^.val = x Alors Si B^.FilsG = nil ET B^.FilsD = nil Alors // Si cest une feuille Librer(B) Sinon Si B^.FilsG nil ET B^.FilsD = nil Alors // Si le sommet admet un sous arbre gauche B B^.FilsG Sinon Si B^.FilsG = nil ET B^.FilsD nil Alors // Si le sommet admet un sous arbre gauche B B^.FilsD Sinon Si B^.FilsG nil ET B^.FilsD nil Alors // Si le sommet admet deux fils // On cherche le plus petit ou le plus grand P PlusPetitSousArbreDroit(B^.FilsD) // ou aussi on peut chercher le plus grand // P PlusGrandSousArbreGauche(B^.FilsG) Q P Q^.FilsG B^.FilsG Q^.FilsD B^.FilsD Librer(P) B Q Fin Si Sinon Si B^.val > x Alors Supprimer(x, B^.FilsG) Sinon Supprimer(x, B^.FilsD) Fin Si Fin Si Fin

EXERCICE N2(LES MESURES) 1)


Fonction Taille (B : Arbre) : Entier Dbut Si B = nil Alors Taille 0 Sinon Taille 1 + Taille(B^.FilsG) + Taille(B^.FilsD) Fin Si Fin

Page 44 sur 53

2)
Fonction Max(x,y :Entier) : Entier Dbut Si x>y Alors Max x Sinon Max y Fin Si Fin Fonction Hauteur(B : Arbre) : Entier Dbut Si B = nil Alors Hauteur 0 Sinon Hauteur 1 + Max(Hauteur(B^.FilsG),Hauteur(B^.FilsD)) Fin Si Fin

3)
Fonction NombreDeNoeudsExternes(B : Arbre) : Entier Dbut Si B = nil Alors NombreDeNoeudsExternes 0 Sinon Si EstUneFeuille(B) Alors NombreDeNoeudsExternes 1 Sinon NombreDeNoeudsExternes NombreDeNoeudsExternes(B^.FilsG) + NombreDeNoeudsExternes(B^.FilsD) Fin Si Fin Si Fin

4)

Fonction NombreDeNoeudsInternes(B : Arbre) : Entier Dbut Si B = nil Alors NombreDeNoeudsInternes 0 Sinon Si EstUneFeuille(B) Alors NombreDeNoeudsInternes 0 Sinon NombreDeNoeudsInternes 1 + NombreDeNoeudsInternes(B^.FilsG) + NombreDeNoeudsInternes(B^.FilsD) Fin Si Fin Si Fin

Page 45 sur 53

5) Spcification : on additionne les profondeurs des feuilles de B (non vide), prof tant la profondeur de la racine de B.

Fonction LongueurCheminArbre(B : Arbre ; prof : Entier) Dbut Si B = nil Alors LongueurCheminArbre 0 Sinon Si B^.FilsG = B^.FilsD Alors LongueurCheminArbre prof Sinon LongueurCheminArbre LongueurCheminArbre(B^.FilsG,prof+1) + LongueurCheminArbre(B^.FilsD,prof+1) Fin Si Fin Si Fin

EXERCICE N3(PARCOURS EN LARGEUR) Avant dentamer limplmentation de la procdure de parcours en largeur nous devons initialement dfinir les diffrentes structures ncessaires.
Type Arbre : ^nud noued : Enregistrement FilsG : Arbre val : Entier FilsD : Arbre Fin noued Liste : ^cellule cellule : Enregistrement val : Arbre suiv : Liste Fin cellule File : Enregistrement Tte : Liste Queue : Liste Fin File

1)

Procdure InitialiserFile(var F : File) Dbut F.Tte nil F.Queue nil Fin

Page 46 sur 53

2)

Fonction FileEstVide(F : File) : Boolen Dbut Si F.Tte = nil Alors FileEstVide vrai Sinon FileEstVide faux Fin Si Fin Procdure Enfiler(B : Arbre ; var F : File) Var P :Liste Dbut Allouer(P) P^.val B P^.suiv nil Si F.Queue nil Alors F.Queue^.suiv P Sinon F.Tte P Fin Si F.Queue P Fin

3)

4)

Procdure Dfiler(var B : Arbre ; var F : File) Var P : Liste Dbut Si F.Tte nil Alors P F.Tte B P^.val F.Tte F.Tte^.suiv Librer(P) Fin Si Si F.Tte = nil Alors F.Queue nil Fin Si Fin

Page 47 sur 53

5)

Procdure ParcoursEnLargeur(B : Arbre ; var larg :Entier) Var F : File Larg_max : Entier Dbut Si B = nil Alors

Larg
Sinon

Ecrire("Arbre vide") InitialiserFile(F) Enfiler(B, F) larg_max 0 Tant que NON(FileEstVide(F)) Faire Dfiler(B, F) Si B = nil Alors Si larg > larg_max Alors larg_max larg Fin Si Si NON(FileEstVide(F)) Alors larg 0 Enfiler(x,F) Fin Si Sinon larg larg + 1 Ecrire(B^.val) Si B^.FilsG nil Alors Enfiler(B^.FilsG, F) Fin Si Si B^.FilsD nil Alors Enfiler(B^.FilsD, F) Fin Si Fin si Fin Tant que

larg
Fin Si Fin

larg_max

EXERCICE N4 (DU DYNAMIQUE VERS LE STATIQUE)


Procdure ConstruireVecteur(B :Arbre ; var n :Entier ; var T :TAB) Dbut Si B = nil Alors T[i] Sinon T[i] B^.val ConstruireVecteur(B^.FilsG, 2*n, T) ConstruireVecteur(B^.FilsD, 2*n+1, T) Fin Si Fin

Page 48 sur 53

EXERCICE N5 (ROTATIONS)
Procdure rotation_droite(var B : Arbre) Var Temp : Arbre Dbut Temp B^.FilsG B^.FilsG B^.FilsD B^.FilsD Temp B Temp Fin Procdure rotation_gauche(var B : Arbre) Var Temp : Arbre Dbut Temp B^.FilsD B^.FilsD B^.FilsG B^.FilsG Temp B Temp Fin

EXERCICE N6 (COPIE)
Procdure Copier(A : Arbre ; var B : Arbre) Dbut Si A nil Alors CrerElement(A^.val, B) Copier(A^.FilsG,B) Copier(A^.FilsD,B) Fin Si Fin

EXERCICE N7 (FUSION)
Procdure Fusion(A,B: Arbre ; var C : Arbre) Dbut Si A nil ET B = nil Alors Copier(A,C) Sinon Si A = nil ET B nil Alors Copier(A,C) Sinon Si A nil ET B nil Alors Si A^.val > b^.val Alors CrerElement(A^.val,C) Fusion(A^.FilsG,B,C) Fusion(A^.FilsD,B,C) Sinon CrerElement(A^.val,C) Fusion(A,B^.FilsG,C) Fusion(A,B^.FilsD,C) Fin Si Fin Si Fin Si Fin

Page 49 sur 53

EXERCICE N8 (DEGENERE, PARFAIT OU COMPLET) 1. Un arbre dgnr est un arbre dont tous les nuds internes sont des points simples. Larbre B est dgnr si taille(B) = hauteur(B) + 1.

Figure 1 : Exemple darbre dgnr La figure 1 montre quun arbre dgnr admet pour chaque sommet un seul fils.
1re solution : sans utiliser les mesures : taille et hauteur Fonction EstDegenere(B : Arbre) : Boolen Dbut Si B = nil Alors EstDegenere vrai Sinon Si (B^.FilsG nil) ET (B^.FilsD nil) Alors EstDegenere faux Sinon Si B^.FilsG = nil Alors EstDegenere EstDegenere(B^.FilsD) Sinon EstDegenere EstDegenere(B^.FilsG) Fin Si Fin Si Fin Si Fin 2me solution : avec les mesures : taille et hauteur Fonction EstDegenere(B : Arbre) : Boolen Dbut Si (Taille(B) = Hauteur(B)+1) Alors EstDegenere vrai Sinon EstDegenere faux Fin Si Fin

Page 50 sur 53

2. On appelle arbre binaire complet un arbre binaire tel que chaque sommet possde 0 ou 2 fils. Larbre B est complet si taille(B) = 2hauteur(B) + 1 1.

Figure 2 : Exemple darbre complet


La figure 2 montre quun arbre complet admet pour chaque sommet zro fils ou deux fils. 1re solution : avec la mesure de la hauteur Fonction EstComplet(B : Arbre, h :Entier) : Boolen Dbut Si B = nil Alors EstComplet (h=-1) Sinon EstComplet EstComplet(B^.FilsG, h-1) ET EstComplet(B^.FilsG, h-1)) Fin Si Fin Appel de la focntion Complet : Boolen Complet EstComplet(B,Hauteur(B)) 2me solution : sans utiliser la mesure de lhauteur La solution propose consiste effectuer un parcours en largeur Fonction EstComplet(B : Arbre) : Boolen Var F : File Larg, larg_prochain : Entier Dbut Si B = nil Alors EstComplet vrai Sinon Initialiser(F) Enfiler(B, F) Larg 0 larg_prochain 1 Tant que NON(EstVide(F)) Faire Dfiler(B,F) Si B = nil Alors Si larg larg_prochain Alors ViderFile(F) EstComplet faux Fin Si Si NON(EstVide(F) Alors larg_prochain 2 * larg larg 0 Enfiler(nil, F) Fin si

Page 51 sur 53

Sinon Larg Larg + 1 Si B^.FilsG nil Alors Enfiler(B^.FilsG, F) Fin Si Si B^.FilsD nil Alors Enfiler(B^.FilsD, F) Fin Si Fin si Fin Tant que EstComplet vrai Fin si Fin

3. On appelle arbre binaire parfait un arbre binaire (complet) tel que chaque sommet est le pre de deux sous-arbres de mme hauteur (figure3). Un arbre binaire parfait possde 2h+1-1 sommets, o h est la hauteur de l'arbre.
Fonction EstParfait(B : Arbre) : Boolen Var F : File fils_vide, parfait : Boolen Dbut Si B = nil Alors EstParfait vrai Sinon Initialiser(F) Enfiler (B, F) fils_vide faux parfait faux Tant que NON(EstVide(F) ET NON(fils_vide) Faire Dfiler(B,F) Si B^.FilsG = nil Alors fils_vide vrai parfait (B^.FilsG = nil) Sinon Enfiler (B^.FilsG, F) Si B^.FilsD nil Alors Enfiler (B^.FilsD, F) Sinon fils_vide vrai Fin Si Fin Si Fin Tant que Tant que NON(EstVide(F)) ET parfait Faire Dfiler(B,F) parfait (B^.FilsG = B^.FilsD) Fin tant que Initialiser(F) EstParfait parfait Fin si Fin

Page 52 sur 53

IBLIOGRAPHIE

S. ROHAUT : Algorithmique et Techniques fondamentale de programmation, Edition Eni 2007. LIGNELET P., Algorithmique. Mthodes et modles, Paris : Masson, 1985. www.intelligentedu.com/blogs/post/free_computer_books/3760/the-algorithm-designmanual/fr/

Page 53 sur 53

You might also like