SlideShare une entreprise Scribd logo
Université Paris XI
I.U.T. d'Orsay
Département Informatique
Année scolaire 2003-2004
Algorithmique : Volume 5
• Récursion
• Listes récursives
• Arbres binaires
Cécile Balkanski, Nelly Bensimon, Gérard Ligozat
iUT ORSAY
Algorithmique 5 : Récursion 1
Exemple 1: Calcul de la factorielle
• fact(3) = 3 × 2 × 1
• fact(N) = N × fact(N -1) la fonction fait appel à elle-même
vrai pour N > 0
• fact(0) = 1 condition d'arrêt
1. Fonction fact(N) retourne (entier)
paramètre (D) N : entier
variable résultat : entier
début
2. si (N = 0)
3. alors retourne (1)
4. sinon résultat Å ( N × fact(N-1) )
5. retourne (résultat)
fsi
fin
Algorithmique 5 : Récursion 2
Simulation
1er appel :
1. N1 = 3
2. (N1 = 0) ? faux
4. r1 Å 3 * fact (2)
Principes d'écriture pour la simulation
1. Numéroter les instructions
1 : en-tête,
2 : instruction qui suit début,
…
k : instruction qui précède fin
2. Indexer, par le niveau d'appel, les noms des paramètres et variables
3. Donner la trace de l'exécution (avec flèches indiquant les appels et les retours)
Exemple : fact(3)
Algorithmique 5 : Récursion 3
Exemple 2: le PGCD de deux entiers
• pgcd(A,B) = pgcd(B, A mod B) appel récursif,
vrai pour B > 0
• pgcd(A,0) = A condition d'arrêt
1. Fonction pgcd(A,B) retourne (entier)
paramètres (D) A,B : entiers
variable résultat : entier test d’arrêt
début de la récursion
2. si B = 0
3. alors retourner (A) appel
4. sinon résultat Å pgcd(B, A mod B) récursif
5. retourne (résultat)
fsi
fin
Algorithmique 5 : Récursion 4
Exemple 2: simulation
réponse Å pgcd(21, 12)
1er appel :
1. A1 = 21, B1 = 12
Algorithmique 5 : Récursion 5
Exemple 3: recherche d'un élément
dans un tableau
Version itérative
Fonction recherche( val, tab, nbr) retourne (booléen)
paramètres (D) val, nbr : entiers
(D) tab : tableau [1, MAX] d'entiers
variables trouvé : booléen ; cpt : entier
début
cpt Å 0 ; trouvé Å FAUX
tant que (non trouvé et cpt < nbr) faire
cpt Å cpt +1
trouvé Å (tab[cpt] = val)
ftq
retourne(trouvé)
fin
Algorithmique 5 : Récursion 6
• recherche(val, tab, nbVal)
- est-ce que val est la dernière valeur du tableau?
- si oui, fin (retourne Vrai), sinon, reprendre dans le
tableau sans la dernière valeur :
recherche(val,tab, nbVal -1)
Æ appel récursif, possible pour nbVal > 0
• nbVal = 0 condition d'arrêt
Idée d'une solution récursive
Algorithmique 5 : Récursion 7
Fonction recherche( val, tab, nbVal) retourne (booléen)
paramètres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbVal : entier test d’arrêt
début de la récursion
si (nbVal = 0)
alors retourne (FAUX)
sinon si (tab[nbVal] = val)
alors retourne (VRAI)
sinon retourne (recherche( val, tab, nbVal - 1))
fsi
fsi appel
fin récursif
Algorithmique 5 : Récursion 8
Exemple 3: simulation
recherche(5, unTab, 4)
unTab 1 5 8 2
1er appel :
1. val1=5, tab1=unTab, nbr1=4
Algorithmique 5 : Récursion 9
version récursive alternative
Æ Comparer les enchaînements récursifs (très inefficace)
Fonction recherche( val, tab, nbr) retourne (booléen)
paramètres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbr : entier
début
si (nbr = 0)
alors retourne (FAUX)
sinon si (recherche( val, tab, nbr - 1))
alors retourne (VRAI)
sinon retourne (tab[nbr] = val)
fsi
fsi
fin
Algorithmique 5 : Récursion 10
écriture récursive alternative
Æ intéressante en C++ ("évaluation paresseuse"),
mais très inefficace en algo
Fonction recherche( val, tab, nbr) retourne (booléen)
paramètres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbr : entier
début
si (nbr = 0)
alors retourne (FAUX)
sinon retourne (tab[nbr] = val OU recherche( val, tab, nbr - 1))
fsi
fin
Algorithmique 5 : Récursion 11
Exemple 4: inversion d'une chaîne de
caractères
Exemple : abcde
1. Enlever le premier caractère a
2. Inverser le reste de la chaîne edcb
Æ appel récursif
3. Rajouter le premier en fin de chaîne edcba
Condition d'arrêt ?
Inverser une chaîne de longueur 1 = ne rien faire
Algorithmique 5 : Récursion 12
Exemple 4: simulation
1er appel : inverser "algo"
1. enlever "a"
2. inverser "lgo"
3. rajouter "a"
Algorithmique 5 : Récursion 13
Procédure d'inversion
Procédure inverser (mot, nbcar)
paramètres (D/R) mot : tableau [1, MAX] de caractères
(D) nbcar : entier
Algorithmique 5 : Récursion 14
Exemple 5: les tours de hanoi
Problème :
transférer les N disques de l'axe A à l'axe C, en utilisant B, de sorte
que jamais un disque ne repose sur un disque de plus petit diamètre.
Ici : N = 5
A B C
Algorithmique 5 : Récursion 15
Idée d'une solution récursive
• supposons que l'on sache résoudre le problème pour (N-1) disques :
1. on déplace (N-1) disques de A vers B en utilisant C
2. on fait passer le N-ième grand disque en C {déplacer le plus grand}
3. on déplace les (N-1) disques de B vers C en utilisant A
• c'est l'idée générale de la récursion :
par exemple, si je sais calculer fact(N-1), je sais calculer fact (N)
{ « réduction » du problème, jusqu’à la condition d’arrêt}
• pour les tours de hanoi, le problème de taille N donne naissance à deux
problèmes de taille (N-1)
Algorithmique 5 : Récursion 16
Squelette d’une procédure récursive
1. Procédure hanoi (source, but, aux, nb)
paramètres
début
2. si nb = 1
alors déplacer un disque de source vers but
3. sinon hanoi (source, aux, but, nb – 1)
4. déplacer un disque de source vers but
5. hanoi (aux, but, source, nb – 1)
fsi
fin
Algorithmique 5 : Récursion 17
Simulation de hanoi(A,C,B,3)
[il manque les flèches d’appel et de retour!]
1er appel : hanoi(A,C,B,3)
1. Faux
3. hanoi(A,B,C,2)
4. déplacer 1 disque de A à C
5. hanoi(B,C,A, 2)
2ème appel : hanoi(A,B,C,2)
1. Faux
3. hanoi(A,C,B,1)
4. déplacer 1 disque de A à B
5. hanoi(C,B,A,1)
3ème appel : hanoi(A,C,B,1)
1. vrai
2. déplacer 1 disque de A à C
4ème appel : hanoi(C,B,A,1)
1. vrai
2. déplacer 1 disque de C à B
5ème appel : hanoi(B,C,A, 2)
1. Faux
3. hanoi(B,A,C,1)
4. déplacer 1 disque de B à C
5. hanoi(A,C,B,1)
6ème appel : hanoi(B,A,C,1)
1. vrai
2. déplacer 1 disque de B à A
7ème appel : hanoi(A,C,B,1)
1. vrai
2. déplacer 1 disque de A à C
Algorithmique 5 : Récursion 18
Simulation de hanoi(A,C,B,3)
A B C A B C
A B C A B C
A B C A B C
Algorithmique 5 : Récursion 19
Récapitulation
• Fonction récursive ?
- Fonction qui s’appelle elle-même.
• Comment éviter les appels infinis ?
- Trouver le test qui va déterminer l’arrêt.
• Comment les écrire?
- Définir le cas général : il contiendra l’appel récursif.
- Définir le cas particulier : c’est le test d’arrêt.
Algorithmique 5 : Récursion 20
Un autre exemple de simulation
Procédure manipTableau(tab, val1, val2)
paramètres (D/R) tab : tableau[1:Max]
(D) val1: entier
(D/R) val2 : entier
début
si val1 ≠ 0
alors manipTableau(tab, val1 – 1, val2)
si tab[val1] ≠ BLANC
alors val2 Å val2 + 1
tab[val2] Å tab[val1]
fsi
fsi
fin
Algorithmique 5 : Récursion 21
Un dernier exemple
Soit un tableau de pixels à deux dimensions N*N. On représente les pixels
allumés à l’aide de la valeur 1 et les pixels éteints à l’aide de la valeur 0.
Ecrire une fonction récursive surfaceRégion qui prend en paramètres
(entre autres) les coordonnées x et y d’un pixel et qui renvoie la surface de
la région à laquelle appartient ce pixel. La surface est évaluée ici en terme
de nombre de pixels allumés. Une région est un ensemble de pixels
allumés liés par continuité horizontale, verticale ou diagonale.
x
1 2 3 4 5
1 1 0 1 1 1
y 2 1 0 0 1 0
3 0 0 0 0 0
4 0 1 1 0 0
5 1 0 1 1 0
Exemple, ce tableau ci-contient 3 régions
et surfaceRégion doit retourner
- 5 pour le point (3,4),
- 2 pour le point (1,2)
- 0 pour le point (5,5)
- 4 pour le point (5,1)
Algorithmique 5 : Listes récursives 22
Listes récursives
Algorithmique 5 : Listes récursives 23
Nouvelle définition d’une liste
• Une liste, c’est
- Soit une liste vide
- Soit une cellule suivie d’une liste
• Définition récursive car une liste est définie par
une liste.
• La règle "soit une liste vide" assure l’arrêt et
donc la cohérence de la définition
Algorithmique 5 : Listes récursives 24
Définition de la classe
Liste Récursive
Classe ListeRéc
Attributs :
non explicités {vous êtes utilisateurs de la classe}
Méthodes :
MFonction vide() {vrai si la liste est vide}
MFonction infoTête() {valeur enregistrée dans la tête}
MFonction reste() {liste obtenue en enlevant la tête}
MFonction préfixer(val) {liste obtenue en insérant val en tête}
Algorithmique 5 : Listes récursives 25
Méthodes
MFonction vide() retourne booléen
{Retourne vrai si la liste est vide, faux sinon}
paramètre (D) cible : ListeRéc
MFonction infoTête() retourne Info
{Retourne la valeur enregistrée dans la tête. Erreur si la liste est vide.}
paramètre (D) cible : ListeRéc
MFonction reste() retourne ListeRéc
{Retourne la liste obtenue en enlevant la tête. Erreur si la liste est vide.}
paramètre (D) cible : ListeRéc
MFonction préfixer(val) retourne ListeRéc
{Retourne la liste obtenue en insérant val en tête.}
paramètre (D) cible : ListeRéc
Algorithmique 5 : Listes récursives 26
Affichage d'une liste récursive
Procédure afficherListe(uneListe)
{Affiche les valeurs contenues dans une liste.}
paramètre (D) uneListe : ListeRéc
début
si non uneListe.vide() {test d’arrêt}
alors afficher(uneListe.infoTête()) {traitement}
afficherListe(uneListe.reste()) {appel récursif}
fsi
fin
Algorithmique 5 : Listes récursives 27
Affichage: simulation
uneL 3
1er appel :
1. uneL1
afficherListe(uneL)
1 7
Algorithmique 5 : Listes récursives 28
Deux types de récursion
Récursion "descendante"
• récursion terminale
("fausse" récursion)
• rien au retour
• traitement suivi de l’appel récursif
• données n’ont pas besoin
d’être stockées
• version itérative possible
Récursion "ascendante"
• récursion non terminal
• exécution au retour, en remontant
• appel récursif suivi du traitement
• données ont besoin d’être stockées
• version itérative beaucoup plus difficile
Algorithmique 5 : Listes récursives 29
Affichage dans l’ordre inverse
Procédure afficherInverse(uneListe)
{Affiche les valeurs contenues dans une liste dans l’ordre inverse.}
paramètre (D) uneListe : ListeRéc
début
si non uneListe.vide() {test d’arrêt}
alors afficherInverse(uneListe.reste()) {appel récursif}
afficher(uneListe.infoTête()) {traitement}
fsi
fin
Algorithmique 5 : Listes récursives 30
Affichage inverse : simulation
uneL 3
1er appel :
1. uneL1
afficherInv(uneL)
1 7
Algorithmique 5 : Listes récursives 31
Longueur d’une liste récursive
Fonction longueur(uneListe) retourne (entier)
{retourne le nombre de cellules faisant partie dans une liste.}
paramètre (D) uneListe : ListeRéc
début
Algorithmique 5 : Listes récursives 32
Longueur: simulation
uneL 3
1er appel :
1. uneL1
longueur(uneL)
1
Algorithmique 5 : Listes récursives 33
Inversion d’une liste récursive
Retourner à l'exemple 4 , transparent 13
• Cas particulier :
- Liste vide : ne rien faire (condition d'arrêt)
• Cas général :
1. Enlever la tête
2. Inverser le reste de la liste (appel récursif)
3. Rajouter la tête en fin de liste
Algorithmique 5 : Listes récursives 34
Fonction inverser(uneListe) retourne (ListeRéc)
{retourne la liste inverse de la liste passée en paramètre.}
paramètre (D) uneListe : ListeRéc
variables premier : Info
nouvListe : LISTE-REC
début
si uneListe.vide()
alors retourner (uneListe)
sinon premier Å uneListe.infoTête()
nouvListe Å inverser(uneListe.reste())
ajoutQueue(premier, nouvListe)
retourner(nouvListe)
fsi
fin
Algorithmique 5 : Listes récursives 35
écriture alternative :
Fonction inverser(uneListe) retourne (ListeRéc)
{retourne la liste inverse de la liste passée en paramètre.}
paramètre (D) uneListe : ListeRéc
début
si uneListe.vide()
alors retourner (uneListe)
sinon retourner (ajoutQueue (uneListe.infoTête(),
inverser(uneListe.reste()) )
fsi
fin
Algorithmique 5 : Listes récursives 36
Fonction ajoutQueue(uneVal, uneListe) retourne (ListeRéc)
{retourne la liste résultant de l’ajout de uneVal en queue de uneListe.}
paramètre (D) uneVal : entier
(D) uneListe : ListeRéc
Algorithmique 5 : Listes récursives 37
ajoutQueue : simulation
uneL 3
1er appel :
1. uneL1
ajoutQueue(uneL,1)
7
Algorithmique 5 : Listes récursives 38
inverser : simulation
uneL 3
1er appel :
1. uneL1
inverser(uneL)
1 7
Algorithmique 5 : Arbres binaires 39
Arbres binaires
Algorithmique 5 : Arbres binaires 40
Représentations arborescentes
Les arborescences sont utilisées :
• Dans la vide de tous les jours : pour représenter
des hiérarchies, des classifications, des partitions
• Dans le domaine de l'informatique : pour
représenter les informations ci-dessus, et aussi :
- L'organisation interne des fichiers en mémoire
- Les mode de calcul d'une expression
- L'organisation de données triées
Algorithmique 5 : Arbres binaires 41
Exemple :
Animal
Mammifère Oiseau Poisson
Chat Chien Souris Canari Merle Requin Eperlan Truite
Tom Médor Jerry
Signification du lien :
- du plus générique au plus spécifique
Autres significations possibles :
- du plus ancien au plus récent
- de la plus haute autorité à la moindre
- du plus complexe au plus simple
Algorithmique 5 : Arbres binaires 42
Comment caractériser un arbre?
• Par sa racine
• Par ses sommets
• Par les arcs reliant les sommets entre eux
• Par ses feuilles
feuilles
sommets
racine
arc
Profondeur = 3
Algorithmique 5 : Arbres binaires 43
Définition récursive
d’un arbre binaire
• Un arbre binaire, c’est
- Soit un arbre binaire vide
- Soit une racine avec deux sous-arbres binaires (appelés fils
gauche et fils droit)
• Définition récursive car un arbre binaire est défini par
un arbre binaire.
• La règle "soit un arbre binaire vide" assure l’arrêt et
donc la cohérence de la définition.
Algorithmique 5 : Arbres binaires 44
Définition de la classe ArbreBinaire
Classe ArbreBinaire
Attributs :
non explicités {vous êtes utilisateurs de la classe}
Méthodes :
MFonction vide() {vrai si l’arbre binaire est vide}
MFonction info() {valeur enregistrée à la racine}
MFonction filsG() {"fils gauche" : sous arbre gauche}
MFonction filsD() {"fils droit" : sous arbre droit}
Algorithmique 5 : Arbres binaires 45
Méthodes
MFonction vide() retourne booléen
{Retourne vrai si l’arbre binaire est vide, faux sinon}
paramètre (D) cible : ArbreBinaire
MFonction info() retourne Info
{Retourne la valeur enregistrée dans la racine. Erreur si l’arbre est vide.}
paramètre (D) cible : ArbreBinaire
MFonction filsG() retourne ArbreBinaire
{Retourne l’arbre binaire formé par le sous arbre gauche (“fils gauche”).
Erreur si l’arbre binaire est vide.}
paramètre (D) cible : ArbreBinaire
MFonction filsD() retourne ArbreBinaire
{Retourne l’arbre binaire formé par le sous arbre droit (“fils droit”).
Erreur si l’arbre binaire est vide.}
paramètre (D) cible : ArbreBinaire
Algorithmique 5 : Arbres binaires 46
Affichages : ordres possibles
Soit l’arbre binaire suivant : 3
3 0
1 5
8
4
9
7
2
6
Affichage
- ordre préfixe : 3 3 7 4 8 0 1 5 2 6 7 9 (racine d’abord)
- ordre suffixe : 4 8 7 3 1 6 7 2 9 5 0 3 (racine en dernier)
- ordre infixe : 4 7 8 3 3 1 0 6 2 7 5 9 (racine au milieu)
7
Algorithmique 5 : Arbres binaires 47
Affichage : ordre préfixe
Procédure affichePréfixe (unArbre)
{Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant la
valeur portée par la racine avant les valeurs portées par les sous-arbres
gauche et droit}
paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel}
début
si non unArbre.vide()
alors afficher (unArbre.info())
affichePréfixe (unArbre.filsG())
affichePréfixe (unArbre.filsD())
fsi
fin
Algorithmique 5 : Arbres binaires 48
Affichage : simulation
Algorithmique 5 : Arbres binaires 49
Affichage : ordre suffixe
Procédure afficheSuffixe (unArbre)
{Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant la
valeur portée par la racine après les valeurs portées par les sous-arbres
gauche et droit}
paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel}
début
si non unArbre.vide()
a
l
o
r
s a
f
f
i
c
h
e
S
u
f
f
i
x
e
(
u
n
A
r
b
r
e
.
f
i
l
s
G
(
)
)
afficheSuffixe (unArbre.filsD())
afficher (unArbre.info())
fsi
fin
Algorithmique 5 : Arbres binaires 50
Affichage : ordre Infixe
Procédure afficheInfixe (unArbre)
{Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant
la valeur portée par la racine entre les valeurs portées par les sous-arbres
gauche et droit}
paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel}
début
si non unArbre.vide()
alors afficheInfixe (unArbre.filsG())
afficher (unArbre.info())
afficheInfixe (unArbre.filsD())
fsi
fin
Algorithmique 5 : Arbres binaires 51
Nombre de sommets d'un arbre binaire
Cas particulier : arbre vide : résultat = 0
Cas général : 1 (sommet de l’arbre courant)
+ nb sommets dans FG
+ nb sommets dans FD
Fonction compteSommets(unArbre) retourne entier
{retourne le nombre de sommets de l'arbre binaire}
paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel}
début
si unArbre.vide()
alors retourne (0)
sinon retourne (1 + compteSommets (unArbre.filsG())
+ compteSommets (unArbre.filsD()))
fsi
fin
Algorithmique 5 : Arbres binaires 52
Application :
arbres binaires de recherche (ABR)
Un arbre binaire de recherche est un arbre binaire
dans lequel la valeur de chaque sommet est
- supérieure [ou égale] à toutes les valeurs étiquetant les
sommets du sous-arbre gauche de ce sommet,
- et inférieure à toutes les valeurs étiquetant les sommets
du sous-arbre droit de ce sommet.
Algorithmique 5 : Arbres binaires 53
Algorithme de construction d’un ABR
Soit val la valeur à placer dans l’ABR
(l’ajout se fera toujours sur une «feuille» : arbre binaire dont le FG et le FD
sont vides)
- Si l’arbre est vide, en créer un, réduit à sa racine, étiquetée avec val
- Sinon si val ≤ valeur portée par la racine,
• alors l’ajouter au sous-arbre gauche : si cet arbre n’est pas vide,
reprendre l’algorithme sur ce sous-arbre
• Sinon l’ajouter au sous-arbre droit : si cet arbre n’est pas vide,
reprendre l’algorithme sur ce sous-arbre
Algorithmique 5 : Arbres binaires 54
Construction d’un ABR : simulation
12 45 -34 0 23 18 19 56 –12 18 45
Algorithmique 5 : Arbres binaires 55
Ajout d’une valeur dans un ABR
MProcédure ajout(uneVal)
{ajoute une valeur à un arbre binaire de recherche}
paramètres (D) uneVal : entier
(D/R) cible : ABR
début
si cible.vide()
alors cible.création(val)
sinon si uneVal ≤ cible.info()
alors (cible.filsG()).ajout(uneVal)
sinon (cible.filsD()).ajout(uneVal)
fsi
fsi
fin MProcédure création(uneVal)
{crée un arbre binaire réduit à sa racine et y affecte unVal}
paramètre (R) cible : ArbreBinaire
(D) uneVal : entier
Algorithmique 5 : Arbres binaires 56
Ajout : simulation
Algorithmique 5 : Arbres binaires 57
Utilisation d’un ABR : trier une liste
Liste Æ arbre binaire de recherche Æ affichage liste triée
construire
Arbre binaire
afficher arbre
Ordre infixe
début
uneListe.saisirListe()
construireABR(uneListe, unABR)
afficheInfixe(unABR)
fin
Algorithmique 5 : Arbres binaires 58
Construire un ABR à partir d’une liste
Procédure construireABR(uneListe, unABR)
{construit un arbre binaire de recherche à partir d’une liste}
paramètre (D) uneListe : LISTE-Rec
(D/R) unABR : ArbreBinaire {supposons TypInfo = entier}
début
si non uneListe.vide()
alors
val ← uneListe.infoTête()
unABR.ajout(val)
construireABR(uneListe.reste(), unABR)
fsi
fin
Algorithmique 5 : Arbres binaires 59
Trier une liste : simulation
Algorithmique 5 60
fin Volume 5

Contenu connexe

Similaire à coursAlgo_V5.pdf

Muscu4
Muscu4Muscu4
Muscu4
ky chug
 
Les vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdfLes vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdf
rezgui10
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétude
Sana Aroussi
 
Cours programmation en matlab2 (1)
Cours programmation en matlab2 (1)Cours programmation en matlab2 (1)
Cours programmation en matlab2 (1)
Guesmi Amal
 
Chaitre 3 Fonctions logiques (1).pptx
Chaitre 3 Fonctions logiques (1).pptxChaitre 3 Fonctions logiques (1).pptx
Chaitre 3 Fonctions logiques (1).pptx
MohammedJaafari3
 
Résumé Algorithme et Programmation
Résumé Algorithme et ProgrammationRésumé Algorithme et Programmation
Résumé Algorithme et Programmation
borhen boukthir
 
Resume algorithme
Resume algorithmeResume algorithme
Resume algorithme
NAWEL_DERBEL
 
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptx
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptxAlgo et complexite file pilezzzzzzzzzzzzzzzz.pptx
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptx
Nabil Alami
 
Les vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptxLes vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptx
rezgui10
 
chap 3 complexité (3).pdf
chap 3 complexité (3).pdfchap 3 complexité (3).pdf
chap 3 complexité (3).pdf
donixwm
 
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)
salah fenni
 
Rappels math - www.coursdefsjes.com
Rappels math - www.coursdefsjes.comRappels math - www.coursdefsjes.com
Rappels math - www.coursdefsjes.com
cours fsjes
 
3_Transformée_de_Laplace.pdf
3_Transformée_de_Laplace.pdf3_Transformée_de_Laplace.pdf
3_Transformée_de_Laplace.pdf
zinaiabdel251179
 
Chapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdfChapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdf
MbarkiIsraa
 
Correction td2
Correction td2Correction td2
Correction td2
USINEALIMENTS
 
Cours de Matlab
Cours de MatlabCours de Matlab
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 

Similaire à coursAlgo_V5.pdf (20)

Muscu4
Muscu4Muscu4
Muscu4
 
Les vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdfLes vecteurs seconde2020.pdf
Les vecteurs seconde2020.pdf
 
Chapitre 3 NP-complétude
Chapitre 3 NP-complétudeChapitre 3 NP-complétude
Chapitre 3 NP-complétude
 
Cours programmation en matlab2 (1)
Cours programmation en matlab2 (1)Cours programmation en matlab2 (1)
Cours programmation en matlab2 (1)
 
Chaitre 3 Fonctions logiques (1).pptx
Chaitre 3 Fonctions logiques (1).pptxChaitre 3 Fonctions logiques (1).pptx
Chaitre 3 Fonctions logiques (1).pptx
 
Résumé Algorithme et Programmation
Résumé Algorithme et ProgrammationRésumé Algorithme et Programmation
Résumé Algorithme et Programmation
 
Resume algorithme
Resume algorithmeResume algorithme
Resume algorithme
 
Video
VideoVideo
Video
 
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptx
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptxAlgo et complexite file pilezzzzzzzzzzzzzzzz.pptx
Algo et complexite file pilezzzzzzzzzzzzzzzz.pptx
 
Les vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptxLes vecteurs seconde2020.pptx
Les vecteurs seconde2020.pptx
 
Récursivité
RécursivitéRécursivité
Récursivité
 
chap 3 complexité (3).pdf
chap 3 complexité (3).pdfchap 3 complexité (3).pdf
chap 3 complexité (3).pdf
 
Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)Algorithmique et programmation en Pascal (résumé)
Algorithmique et programmation en Pascal (résumé)
 
Rappels math - www.coursdefsjes.com
Rappels math - www.coursdefsjes.comRappels math - www.coursdefsjes.com
Rappels math - www.coursdefsjes.com
 
3_Transformée_de_Laplace.pdf
3_Transformée_de_Laplace.pdf3_Transformée_de_Laplace.pdf
3_Transformée_de_Laplace.pdf
 
Chapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdfChapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdf
 
246242769 sequence-1-pdf
246242769 sequence-1-pdf246242769 sequence-1-pdf
246242769 sequence-1-pdf
 
Correction td2
Correction td2Correction td2
Correction td2
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 

Dernier

Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
Newsletter SPW Agriculture en province du Luxembourg du 12-06-24Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
BenotGeorges3
 
Iris van Herpen. pptx
Iris         van         Herpen.      pptxIris         van         Herpen.      pptx
Iris van Herpen. pptx
Txaruka
 
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
M2i Formation
 
Iris van Herpen. pptx
Iris         van        Herpen.      pptxIris         van        Herpen.      pptx
Iris van Herpen. pptx
Txaruka
 
Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
Friends of African Village Libraries
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
Txaruka
 

Dernier (6)

Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
Newsletter SPW Agriculture en province du Luxembourg du 12-06-24Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
Newsletter SPW Agriculture en province du Luxembourg du 12-06-24
 
Iris van Herpen. pptx
Iris         van         Herpen.      pptxIris         van         Herpen.      pptx
Iris van Herpen. pptx
 
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
Formation M2i - Onboarding réussi - les clés pour intégrer efficacement vos n...
 
Iris van Herpen. pptx
Iris         van        Herpen.      pptxIris         van        Herpen.      pptx
Iris van Herpen. pptx
 
Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
 

coursAlgo_V5.pdf

  • 1. Université Paris XI I.U.T. d'Orsay Département Informatique Année scolaire 2003-2004 Algorithmique : Volume 5 • Récursion • Listes récursives • Arbres binaires Cécile Balkanski, Nelly Bensimon, Gérard Ligozat iUT ORSAY
  • 2. Algorithmique 5 : Récursion 1 Exemple 1: Calcul de la factorielle • fact(3) = 3 × 2 × 1 • fact(N) = N × fact(N -1) la fonction fait appel à elle-même vrai pour N > 0 • fact(0) = 1 condition d'arrêt 1. Fonction fact(N) retourne (entier) paramètre (D) N : entier variable résultat : entier début 2. si (N = 0) 3. alors retourne (1) 4. sinon résultat Å ( N × fact(N-1) ) 5. retourne (résultat) fsi fin
  • 3. Algorithmique 5 : Récursion 2 Simulation 1er appel : 1. N1 = 3 2. (N1 = 0) ? faux 4. r1 Å 3 * fact (2) Principes d'écriture pour la simulation 1. Numéroter les instructions 1 : en-tête, 2 : instruction qui suit début, … k : instruction qui précède fin 2. Indexer, par le niveau d'appel, les noms des paramètres et variables 3. Donner la trace de l'exécution (avec flèches indiquant les appels et les retours) Exemple : fact(3)
  • 4. Algorithmique 5 : Récursion 3 Exemple 2: le PGCD de deux entiers • pgcd(A,B) = pgcd(B, A mod B) appel récursif, vrai pour B > 0 • pgcd(A,0) = A condition d'arrêt 1. Fonction pgcd(A,B) retourne (entier) paramètres (D) A,B : entiers variable résultat : entier test d’arrêt début de la récursion 2. si B = 0 3. alors retourner (A) appel 4. sinon résultat Å pgcd(B, A mod B) récursif 5. retourne (résultat) fsi fin
  • 5. Algorithmique 5 : Récursion 4 Exemple 2: simulation réponse Å pgcd(21, 12) 1er appel : 1. A1 = 21, B1 = 12
  • 6. Algorithmique 5 : Récursion 5 Exemple 3: recherche d'un élément dans un tableau Version itérative Fonction recherche( val, tab, nbr) retourne (booléen) paramètres (D) val, nbr : entiers (D) tab : tableau [1, MAX] d'entiers variables trouvé : booléen ; cpt : entier début cpt Å 0 ; trouvé Å FAUX tant que (non trouvé et cpt < nbr) faire cpt Å cpt +1 trouvé Å (tab[cpt] = val) ftq retourne(trouvé) fin
  • 7. Algorithmique 5 : Récursion 6 • recherche(val, tab, nbVal) - est-ce que val est la dernière valeur du tableau? - si oui, fin (retourne Vrai), sinon, reprendre dans le tableau sans la dernière valeur : recherche(val,tab, nbVal -1) Æ appel récursif, possible pour nbVal > 0 • nbVal = 0 condition d'arrêt Idée d'une solution récursive
  • 8. Algorithmique 5 : Récursion 7 Fonction recherche( val, tab, nbVal) retourne (booléen) paramètres (D) val : entier (D) tab : tableau [1, MAX] d'entiers (D) nbVal : entier test d’arrêt début de la récursion si (nbVal = 0) alors retourne (FAUX) sinon si (tab[nbVal] = val) alors retourne (VRAI) sinon retourne (recherche( val, tab, nbVal - 1)) fsi fsi appel fin récursif
  • 9. Algorithmique 5 : Récursion 8 Exemple 3: simulation recherche(5, unTab, 4) unTab 1 5 8 2 1er appel : 1. val1=5, tab1=unTab, nbr1=4
  • 10. Algorithmique 5 : Récursion 9 version récursive alternative Æ Comparer les enchaînements récursifs (très inefficace) Fonction recherche( val, tab, nbr) retourne (booléen) paramètres (D) val : entier (D) tab : tableau [1, MAX] d'entiers (D) nbr : entier début si (nbr = 0) alors retourne (FAUX) sinon si (recherche( val, tab, nbr - 1)) alors retourne (VRAI) sinon retourne (tab[nbr] = val) fsi fsi fin
  • 11. Algorithmique 5 : Récursion 10 écriture récursive alternative Æ intéressante en C++ ("évaluation paresseuse"), mais très inefficace en algo Fonction recherche( val, tab, nbr) retourne (booléen) paramètres (D) val : entier (D) tab : tableau [1, MAX] d'entiers (D) nbr : entier début si (nbr = 0) alors retourne (FAUX) sinon retourne (tab[nbr] = val OU recherche( val, tab, nbr - 1)) fsi fin
  • 12. Algorithmique 5 : Récursion 11 Exemple 4: inversion d'une chaîne de caractères Exemple : abcde 1. Enlever le premier caractère a 2. Inverser le reste de la chaîne edcb Æ appel récursif 3. Rajouter le premier en fin de chaîne edcba Condition d'arrêt ? Inverser une chaîne de longueur 1 = ne rien faire
  • 13. Algorithmique 5 : Récursion 12 Exemple 4: simulation 1er appel : inverser "algo" 1. enlever "a" 2. inverser "lgo" 3. rajouter "a"
  • 14. Algorithmique 5 : Récursion 13 Procédure d'inversion Procédure inverser (mot, nbcar) paramètres (D/R) mot : tableau [1, MAX] de caractères (D) nbcar : entier
  • 15. Algorithmique 5 : Récursion 14 Exemple 5: les tours de hanoi Problème : transférer les N disques de l'axe A à l'axe C, en utilisant B, de sorte que jamais un disque ne repose sur un disque de plus petit diamètre. Ici : N = 5 A B C
  • 16. Algorithmique 5 : Récursion 15 Idée d'une solution récursive • supposons que l'on sache résoudre le problème pour (N-1) disques : 1. on déplace (N-1) disques de A vers B en utilisant C 2. on fait passer le N-ième grand disque en C {déplacer le plus grand} 3. on déplace les (N-1) disques de B vers C en utilisant A • c'est l'idée générale de la récursion : par exemple, si je sais calculer fact(N-1), je sais calculer fact (N) { « réduction » du problème, jusqu’à la condition d’arrêt} • pour les tours de hanoi, le problème de taille N donne naissance à deux problèmes de taille (N-1)
  • 17. Algorithmique 5 : Récursion 16 Squelette d’une procédure récursive 1. Procédure hanoi (source, but, aux, nb) paramètres début 2. si nb = 1 alors déplacer un disque de source vers but 3. sinon hanoi (source, aux, but, nb – 1) 4. déplacer un disque de source vers but 5. hanoi (aux, but, source, nb – 1) fsi fin
  • 18. Algorithmique 5 : Récursion 17 Simulation de hanoi(A,C,B,3) [il manque les flèches d’appel et de retour!] 1er appel : hanoi(A,C,B,3) 1. Faux 3. hanoi(A,B,C,2) 4. déplacer 1 disque de A à C 5. hanoi(B,C,A, 2) 2ème appel : hanoi(A,B,C,2) 1. Faux 3. hanoi(A,C,B,1) 4. déplacer 1 disque de A à B 5. hanoi(C,B,A,1) 3ème appel : hanoi(A,C,B,1) 1. vrai 2. déplacer 1 disque de A à C 4ème appel : hanoi(C,B,A,1) 1. vrai 2. déplacer 1 disque de C à B 5ème appel : hanoi(B,C,A, 2) 1. Faux 3. hanoi(B,A,C,1) 4. déplacer 1 disque de B à C 5. hanoi(A,C,B,1) 6ème appel : hanoi(B,A,C,1) 1. vrai 2. déplacer 1 disque de B à A 7ème appel : hanoi(A,C,B,1) 1. vrai 2. déplacer 1 disque de A à C
  • 19. Algorithmique 5 : Récursion 18 Simulation de hanoi(A,C,B,3) A B C A B C A B C A B C A B C A B C
  • 20. Algorithmique 5 : Récursion 19 Récapitulation • Fonction récursive ? - Fonction qui s’appelle elle-même. • Comment éviter les appels infinis ? - Trouver le test qui va déterminer l’arrêt. • Comment les écrire? - Définir le cas général : il contiendra l’appel récursif. - Définir le cas particulier : c’est le test d’arrêt.
  • 21. Algorithmique 5 : Récursion 20 Un autre exemple de simulation Procédure manipTableau(tab, val1, val2) paramètres (D/R) tab : tableau[1:Max] (D) val1: entier (D/R) val2 : entier début si val1 ≠ 0 alors manipTableau(tab, val1 – 1, val2) si tab[val1] ≠ BLANC alors val2 Å val2 + 1 tab[val2] Å tab[val1] fsi fsi fin
  • 22. Algorithmique 5 : Récursion 21 Un dernier exemple Soit un tableau de pixels à deux dimensions N*N. On représente les pixels allumés à l’aide de la valeur 1 et les pixels éteints à l’aide de la valeur 0. Ecrire une fonction récursive surfaceRégion qui prend en paramètres (entre autres) les coordonnées x et y d’un pixel et qui renvoie la surface de la région à laquelle appartient ce pixel. La surface est évaluée ici en terme de nombre de pixels allumés. Une région est un ensemble de pixels allumés liés par continuité horizontale, verticale ou diagonale. x 1 2 3 4 5 1 1 0 1 1 1 y 2 1 0 0 1 0 3 0 0 0 0 0 4 0 1 1 0 0 5 1 0 1 1 0 Exemple, ce tableau ci-contient 3 régions et surfaceRégion doit retourner - 5 pour le point (3,4), - 2 pour le point (1,2) - 0 pour le point (5,5) - 4 pour le point (5,1)
  • 23. Algorithmique 5 : Listes récursives 22 Listes récursives
  • 24. Algorithmique 5 : Listes récursives 23 Nouvelle définition d’une liste • Une liste, c’est - Soit une liste vide - Soit une cellule suivie d’une liste • Définition récursive car une liste est définie par une liste. • La règle "soit une liste vide" assure l’arrêt et donc la cohérence de la définition
  • 25. Algorithmique 5 : Listes récursives 24 Définition de la classe Liste Récursive Classe ListeRéc Attributs : non explicités {vous êtes utilisateurs de la classe} Méthodes : MFonction vide() {vrai si la liste est vide} MFonction infoTête() {valeur enregistrée dans la tête} MFonction reste() {liste obtenue en enlevant la tête} MFonction préfixer(val) {liste obtenue en insérant val en tête}
  • 26. Algorithmique 5 : Listes récursives 25 Méthodes MFonction vide() retourne booléen {Retourne vrai si la liste est vide, faux sinon} paramètre (D) cible : ListeRéc MFonction infoTête() retourne Info {Retourne la valeur enregistrée dans la tête. Erreur si la liste est vide.} paramètre (D) cible : ListeRéc MFonction reste() retourne ListeRéc {Retourne la liste obtenue en enlevant la tête. Erreur si la liste est vide.} paramètre (D) cible : ListeRéc MFonction préfixer(val) retourne ListeRéc {Retourne la liste obtenue en insérant val en tête.} paramètre (D) cible : ListeRéc
  • 27. Algorithmique 5 : Listes récursives 26 Affichage d'une liste récursive Procédure afficherListe(uneListe) {Affiche les valeurs contenues dans une liste.} paramètre (D) uneListe : ListeRéc début si non uneListe.vide() {test d’arrêt} alors afficher(uneListe.infoTête()) {traitement} afficherListe(uneListe.reste()) {appel récursif} fsi fin
  • 28. Algorithmique 5 : Listes récursives 27 Affichage: simulation uneL 3 1er appel : 1. uneL1 afficherListe(uneL) 1 7
  • 29. Algorithmique 5 : Listes récursives 28 Deux types de récursion Récursion "descendante" • récursion terminale ("fausse" récursion) • rien au retour • traitement suivi de l’appel récursif • données n’ont pas besoin d’être stockées • version itérative possible Récursion "ascendante" • récursion non terminal • exécution au retour, en remontant • appel récursif suivi du traitement • données ont besoin d’être stockées • version itérative beaucoup plus difficile
  • 30. Algorithmique 5 : Listes récursives 29 Affichage dans l’ordre inverse Procédure afficherInverse(uneListe) {Affiche les valeurs contenues dans une liste dans l’ordre inverse.} paramètre (D) uneListe : ListeRéc début si non uneListe.vide() {test d’arrêt} alors afficherInverse(uneListe.reste()) {appel récursif} afficher(uneListe.infoTête()) {traitement} fsi fin
  • 31. Algorithmique 5 : Listes récursives 30 Affichage inverse : simulation uneL 3 1er appel : 1. uneL1 afficherInv(uneL) 1 7
  • 32. Algorithmique 5 : Listes récursives 31 Longueur d’une liste récursive Fonction longueur(uneListe) retourne (entier) {retourne le nombre de cellules faisant partie dans une liste.} paramètre (D) uneListe : ListeRéc début
  • 33. Algorithmique 5 : Listes récursives 32 Longueur: simulation uneL 3 1er appel : 1. uneL1 longueur(uneL) 1
  • 34. Algorithmique 5 : Listes récursives 33 Inversion d’une liste récursive Retourner à l'exemple 4 , transparent 13 • Cas particulier : - Liste vide : ne rien faire (condition d'arrêt) • Cas général : 1. Enlever la tête 2. Inverser le reste de la liste (appel récursif) 3. Rajouter la tête en fin de liste
  • 35. Algorithmique 5 : Listes récursives 34 Fonction inverser(uneListe) retourne (ListeRéc) {retourne la liste inverse de la liste passée en paramètre.} paramètre (D) uneListe : ListeRéc variables premier : Info nouvListe : LISTE-REC début si uneListe.vide() alors retourner (uneListe) sinon premier Å uneListe.infoTête() nouvListe Å inverser(uneListe.reste()) ajoutQueue(premier, nouvListe) retourner(nouvListe) fsi fin
  • 36. Algorithmique 5 : Listes récursives 35 écriture alternative : Fonction inverser(uneListe) retourne (ListeRéc) {retourne la liste inverse de la liste passée en paramètre.} paramètre (D) uneListe : ListeRéc début si uneListe.vide() alors retourner (uneListe) sinon retourner (ajoutQueue (uneListe.infoTête(), inverser(uneListe.reste()) ) fsi fin
  • 37. Algorithmique 5 : Listes récursives 36 Fonction ajoutQueue(uneVal, uneListe) retourne (ListeRéc) {retourne la liste résultant de l’ajout de uneVal en queue de uneListe.} paramètre (D) uneVal : entier (D) uneListe : ListeRéc
  • 38. Algorithmique 5 : Listes récursives 37 ajoutQueue : simulation uneL 3 1er appel : 1. uneL1 ajoutQueue(uneL,1) 7
  • 39. Algorithmique 5 : Listes récursives 38 inverser : simulation uneL 3 1er appel : 1. uneL1 inverser(uneL) 1 7
  • 40. Algorithmique 5 : Arbres binaires 39 Arbres binaires
  • 41. Algorithmique 5 : Arbres binaires 40 Représentations arborescentes Les arborescences sont utilisées : • Dans la vide de tous les jours : pour représenter des hiérarchies, des classifications, des partitions • Dans le domaine de l'informatique : pour représenter les informations ci-dessus, et aussi : - L'organisation interne des fichiers en mémoire - Les mode de calcul d'une expression - L'organisation de données triées
  • 42. Algorithmique 5 : Arbres binaires 41 Exemple : Animal Mammifère Oiseau Poisson Chat Chien Souris Canari Merle Requin Eperlan Truite Tom Médor Jerry Signification du lien : - du plus générique au plus spécifique Autres significations possibles : - du plus ancien au plus récent - de la plus haute autorité à la moindre - du plus complexe au plus simple
  • 43. Algorithmique 5 : Arbres binaires 42 Comment caractériser un arbre? • Par sa racine • Par ses sommets • Par les arcs reliant les sommets entre eux • Par ses feuilles feuilles sommets racine arc Profondeur = 3
  • 44. Algorithmique 5 : Arbres binaires 43 Définition récursive d’un arbre binaire • Un arbre binaire, c’est - Soit un arbre binaire vide - Soit une racine avec deux sous-arbres binaires (appelés fils gauche et fils droit) • Définition récursive car un arbre binaire est défini par un arbre binaire. • La règle "soit un arbre binaire vide" assure l’arrêt et donc la cohérence de la définition.
  • 45. Algorithmique 5 : Arbres binaires 44 Définition de la classe ArbreBinaire Classe ArbreBinaire Attributs : non explicités {vous êtes utilisateurs de la classe} Méthodes : MFonction vide() {vrai si l’arbre binaire est vide} MFonction info() {valeur enregistrée à la racine} MFonction filsG() {"fils gauche" : sous arbre gauche} MFonction filsD() {"fils droit" : sous arbre droit}
  • 46. Algorithmique 5 : Arbres binaires 45 Méthodes MFonction vide() retourne booléen {Retourne vrai si l’arbre binaire est vide, faux sinon} paramètre (D) cible : ArbreBinaire MFonction info() retourne Info {Retourne la valeur enregistrée dans la racine. Erreur si l’arbre est vide.} paramètre (D) cible : ArbreBinaire MFonction filsG() retourne ArbreBinaire {Retourne l’arbre binaire formé par le sous arbre gauche (“fils gauche”). Erreur si l’arbre binaire est vide.} paramètre (D) cible : ArbreBinaire MFonction filsD() retourne ArbreBinaire {Retourne l’arbre binaire formé par le sous arbre droit (“fils droit”). Erreur si l’arbre binaire est vide.} paramètre (D) cible : ArbreBinaire
  • 47. Algorithmique 5 : Arbres binaires 46 Affichages : ordres possibles Soit l’arbre binaire suivant : 3 3 0 1 5 8 4 9 7 2 6 Affichage - ordre préfixe : 3 3 7 4 8 0 1 5 2 6 7 9 (racine d’abord) - ordre suffixe : 4 8 7 3 1 6 7 2 9 5 0 3 (racine en dernier) - ordre infixe : 4 7 8 3 3 1 0 6 2 7 5 9 (racine au milieu) 7
  • 48. Algorithmique 5 : Arbres binaires 47 Affichage : ordre préfixe Procédure affichePréfixe (unArbre) {Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant la valeur portée par la racine avant les valeurs portées par les sous-arbres gauche et droit} paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel} début si non unArbre.vide() alors afficher (unArbre.info()) affichePréfixe (unArbre.filsG()) affichePréfixe (unArbre.filsD()) fsi fin
  • 49. Algorithmique 5 : Arbres binaires 48 Affichage : simulation
  • 50. Algorithmique 5 : Arbres binaires 49 Affichage : ordre suffixe Procédure afficheSuffixe (unArbre) {Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant la valeur portée par la racine après les valeurs portées par les sous-arbres gauche et droit} paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel} début si non unArbre.vide() a l o r s a f f i c h e S u f f i x e ( u n A r b r e . f i l s G ( ) ) afficheSuffixe (unArbre.filsD()) afficher (unArbre.info()) fsi fin
  • 51. Algorithmique 5 : Arbres binaires 50 Affichage : ordre Infixe Procédure afficheInfixe (unArbre) {Affiche les valeurs portées par les sommets de l'arbre binaire, en affichant la valeur portée par la racine entre les valeurs portées par les sous-arbres gauche et droit} paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel} début si non unArbre.vide() alors afficheInfixe (unArbre.filsG()) afficher (unArbre.info()) afficheInfixe (unArbre.filsD()) fsi fin
  • 52. Algorithmique 5 : Arbres binaires 51 Nombre de sommets d'un arbre binaire Cas particulier : arbre vide : résultat = 0 Cas général : 1 (sommet de l’arbre courant) + nb sommets dans FG + nb sommets dans FD Fonction compteSommets(unArbre) retourne entier {retourne le nombre de sommets de l'arbre binaire} paramètre (D) unArbre : ArbreBinaire {supposons TypInfo = réel} début si unArbre.vide() alors retourne (0) sinon retourne (1 + compteSommets (unArbre.filsG()) + compteSommets (unArbre.filsD())) fsi fin
  • 53. Algorithmique 5 : Arbres binaires 52 Application : arbres binaires de recherche (ABR) Un arbre binaire de recherche est un arbre binaire dans lequel la valeur de chaque sommet est - supérieure [ou égale] à toutes les valeurs étiquetant les sommets du sous-arbre gauche de ce sommet, - et inférieure à toutes les valeurs étiquetant les sommets du sous-arbre droit de ce sommet.
  • 54. Algorithmique 5 : Arbres binaires 53 Algorithme de construction d’un ABR Soit val la valeur à placer dans l’ABR (l’ajout se fera toujours sur une «feuille» : arbre binaire dont le FG et le FD sont vides) - Si l’arbre est vide, en créer un, réduit à sa racine, étiquetée avec val - Sinon si val ≤ valeur portée par la racine, • alors l’ajouter au sous-arbre gauche : si cet arbre n’est pas vide, reprendre l’algorithme sur ce sous-arbre • Sinon l’ajouter au sous-arbre droit : si cet arbre n’est pas vide, reprendre l’algorithme sur ce sous-arbre
  • 55. Algorithmique 5 : Arbres binaires 54 Construction d’un ABR : simulation 12 45 -34 0 23 18 19 56 –12 18 45
  • 56. Algorithmique 5 : Arbres binaires 55 Ajout d’une valeur dans un ABR MProcédure ajout(uneVal) {ajoute une valeur à un arbre binaire de recherche} paramètres (D) uneVal : entier (D/R) cible : ABR début si cible.vide() alors cible.création(val) sinon si uneVal ≤ cible.info() alors (cible.filsG()).ajout(uneVal) sinon (cible.filsD()).ajout(uneVal) fsi fsi fin MProcédure création(uneVal) {crée un arbre binaire réduit à sa racine et y affecte unVal} paramètre (R) cible : ArbreBinaire (D) uneVal : entier
  • 57. Algorithmique 5 : Arbres binaires 56 Ajout : simulation
  • 58. Algorithmique 5 : Arbres binaires 57 Utilisation d’un ABR : trier une liste Liste Æ arbre binaire de recherche Æ affichage liste triée construire Arbre binaire afficher arbre Ordre infixe début uneListe.saisirListe() construireABR(uneListe, unABR) afficheInfixe(unABR) fin
  • 59. Algorithmique 5 : Arbres binaires 58 Construire un ABR à partir d’une liste Procédure construireABR(uneListe, unABR) {construit un arbre binaire de recherche à partir d’une liste} paramètre (D) uneListe : LISTE-Rec (D/R) unABR : ArbreBinaire {supposons TypInfo = entier} début si non uneListe.vide() alors val ← uneListe.infoTête() unABR.ajout(val) construireABR(uneListe.reste(), unABR) fsi fin
  • 60. Algorithmique 5 : Arbres binaires 59 Trier une liste : simulation