Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Matière : algorithmique
fondamentale
Semestre 1
Année Universitaire : 2021-2022
EXERCICE 2 :
Etant donné un arbre binaire composé de N nœuds. On suppose que l’arbre est équilibré.
Chaque nœud contient une valeur val, un pointeur FG vers le fils gauche et un pointeur
FD vers le fils droit. La racine est pointée par un pointeur « Arbre ».
1. Ecrire un algorithme récursif basé sur le paradigme « diviser-pour-régner »
permettant de déterminer la valeur maximale se trouvant dans l’arbre. Estimer sa
complexité.
Fonction maximum (A : Arbre) : entier
Variables
Maxg : entier
maxd : entier
Début
Si A = NULL alors retourner -99999 /*-*/ fin si
Si estFeuille(A)
alors retourner A^.val
Sinon
Maxg maximum (A^.FG)
Maxd maximum (A^.FD)
Retourner (max (A^.val, Maxg, Maxd)
Fin si
Fin si
Fin
On commence par écrire une fonction cree-arbre qui permet de créer un nœud de la valeur val
ayant deux fils gauche et droit, ensuite écrire une fonction permettant d’insérer un élément
dans un ABR et appeler cette dernière fonction autant de fois que la taille du tableau.
Fonction cree_arbre ( val ; entier , FG : arbre, FD :arbre ) : Arbre
Début
Allouer(A)
A^.val val
A^.gauche FG
A^.droit FD
retourner A
2
Fin
Fonction insere ( A :arbre, v:entier) : arbre
Début
Si (A = NIL)
Retourner cree_arbre (v , NIL, NIL)
Sinon
Si ( v < A^.val) )
A^.FG insere ( A^.FG , v )
Sinon
A^.FD insere (A^.FD , v)
Finsi
Retourner A ;
Finsi
Fin
Fonction construire (T : tableau d’entiers, taille) :arbre
Variables
i :entier
Début
A:arbre
Pour i de 1 à taille faire
AInsere (A, T[i])
FinPour
Retourner A
Fin
3
EXERCICE 3 :
Etant donné un arbre binaire contenant N nœuds. Chaque nœud contient une valeur X, un
pointeur FG vers le fils gauche et un pointeur FD vers le fils droit.
4
Si (estFeuille(A)) alors retourner vrai fin si
Si (estVide(A^.FG)) alors
Max_gauche A^.val -1 //initialiser avec une valeur inférieure à A^.val
Sinon
Max_gauche maximum (A^.FG) // calcule de la valeur maximale du SAG
Fin si
Si (Max_gauche >A^.val) alors retourner faux fin si
Si (estVide(A^.FD)) alors
Min_droite A^.val + 1 //initialiser avec une valeur supérieure à A^.val
sinon
Min_droite minimum (A^.FD) // calcule la valeur minimale du SAD
Fin si
Si (A^.val > Min_droite) alors retourner faux fin si
retourner ( VerifABR (A^.FG) et VerifABR (A^.FD));
Fin
//***
Complexité :
T(n)=O(n) dans le pire des cas (si l’arbre est un ABR)
T(n)=1 dans les meilleurs des cas (Exemple : la racine est inférieure à son fils gauche (
est la SAG est réduite à ce fils)
EXERCICE 4 :
Soit un arbre binaire où chaque nœud contient :
• soit une valeur entière si le nœud est terminal
• soit un opérateur arithmétique binaire (+ , - , * , /) un caractère parmi : ‘+’, ‘-‘,
‘*’, ‘/’ si le nœud n’est pas terminal.
Un nœud est terminal si ses deux fils sont nuls. Sachant que tous les opérateurs sont
binaires, chaque nœud admet ou bien 0 fils ou bien 2 fils.
Exemple : L’arbre ci-dessous représente l’expression 3*(10 +13) +10 /(18 - 23) .
* /
+ 10 -
3
10 13 18 23
1. Ecrire une fonction qui permet de vérifier si un arbre A est ou non complet
Rappel
• Un arbre binaire complet est un arbre binaire dont chaque sommet interne a
exactement deux fils.
• Tout sommet x d'un arbre binaire vérifie l'une des deux propriétés suivantes :
5
o x est une feuille,
o x a un sous arbre binaire dit gauche de racine G(x) et un sous arbre
binaire droit de racine D(x).
• Un arbre binaire parfait est un arbre binaire complet dans lequel toutes les feuilles
sont à la même hauteur dans l'arbre.
• Un arbre binaire de taille n a une hauteur moyenne log2(n).
//***********
2. Ecrire une fonction qui permet de calculer la valeur d’une expression représentée
par un arbre A et retourne sa valeur.
Nœud =enregistrement
Fonction Expression (A : Arbre) : Entier
op : caractère
Variables :
val : entier
Val_g, val_d : Entier
FG : pointeur vers Nœud
Début
FD : pointeur vers Nœud
Si EstVide(A) alors retourner 0 ;
Fin enregistrement
sinon Si EstFeuille(A) alors return (A^.val) ;
Arbre : pointeur vers nœud
sinon val_g Expression(A^.FG)) ;
6
val_d Expression(A^.FD) ;
Si A^.op = ‘+’ alors retourner (val_g + val_d) ;
sinon Si A^.op= ‘−‘ alors retourner val_g – val_d ;
sinon Si A^.op = ‘∗’ alors retourner vg ∗ vd ;
sinon retourner val_g/val_d ;
Fin si
Fin si
Fin si
Fin si
Fin si
Fin
3. Ecrire une fonction qui permet d’afficher en notation parenthésée l’expression
représentée par l’arbre A.
EXERCICE 5 :
1. Ecrire une fonction qui permet de chercher une valeur X dans un arbre binaire de
recherche A. La fonction retourne un pointeur sur le nœud et un pointeur sur son père
si X est trouvé. Si l’élément est trouvé dans la racine de l’arbre, le pointeur sur le père
sera nul.
7
Fin si
Fin
1ier appel récursif poschercher(A, NULL, X)
2. Ecrire une fonction qui localise l’élément minimal d’un sous-arbre, le supprime de
l’arbre et retourne sa valeur.
8
Fin si Fin si Fin si
Si Degre(A) = 2
Alors /*recherche de la plus petite valeur du sous arbre droite */
Val_min supprimer_min(A) ;
A^.val = val_min ;
Finsi
Free(A)
Retourner R
Fin
4. Ecrire une fonction qui supprime une valeur X dans un arbre binaire de recherche
A.
EXERCICE 6 :
On voudrait écrire un vérificateur d’orthographe à l’aide d’un dictionnaire implémenté
sous la forme d’un arbre binaire de recherche tel que chaque nœud contient un mot du
dictionnaire et le mot contenu dans un nœud père est supérieur au mot contenu dans le
nœud du fils gauche et inférieur au mot contenu dans le nœud du fils droit. On suppose
que la longueur d’un mot ne dépasse pas 20 caractères.
1. Définir les structures de données (« nœud » et « Dictionnaire ») nécessaires pour
l’implémentation d’un dictionnaire sous la forme chaînée.
9
Si (strcmp(Max_gauche , DICO^.Mot) >0) alors retourner faux fin si
Si (estVide(DICO^.FD))
Alors Min_droite « zzzz » ;
Sinon Min_droite minimum (DICO^.FD)
Fin si
Si (strcmp(DICO^.Mot , Min_droite) > 0) alors retourner faux fin si
Retourner ( VerifABR (DICO^.FG) et VerifABR (DICO^.FD));
Fin
4. Ecrire une fonction « Existe » permettant de vérifier si un mot donné MOT existe
ou non dans un dictionnaire DICO. (Vous pouvez utiliser la fonction « strcmp »
pour comparer deux mots).
10
Fin si Fin si
Fin tant que
Retourner Faux
Fin
5. Ecrire une fonction « Imprimer » permettant d’imprimer par ordre alphabétique tous
les mots du dictionnaire DICO.
6. Sachant que le dictionnaire contient N mots. Quelle sont les complexités au pire et
au meilleur en nombre de comparaisons de mots de la fonction « Existe ».
T(n) = O(1) au meilleur lorsque l’élément est dans la racine
T(n) = O(n) si l’élément est le dernier et l’arbre n’est pas équilibré (arbre linéaire)
T(n) = O(Log n) si l’élément est le dernier et l’arbre est équilibré
EXERCICE 7 :
Etant donné un arbre binaire de recherche A. Chaque nœud contient : val : une valeur entière,
FG : un pointeur sur le fils gauche et FD : un pointeur sur le fils droit. La structure «
Arbre » contient un seul pointeur « racine » pointant sur le premier nœud de l’arbre.
1. Ecrire une fonction permettant de compter et de retourner le nombre de nœuds (non
null) se trouvant dans l’arbre.
2. Ecrire une fonction permettant de supprimer le nœud contenant la plus petite valeur.
Quelle est sa complexité au pire, au meilleur et moyenne ?
11
Même travail que l’exercice 5
12