Vous êtes sur la page 1sur 7

UNIVERSITE CHOUAÏB DOUKKALI

Faculté des Sciences


EL JADIDA
Département d’Informatique Année Universitaire 2018/2019
Filière : SMI4
CORRECTION SERIE N° 2
Algorithmiques et Structures de Données
Exercice 1 :
1. Écrire une fonction cree_arbre() qui prend en argument une valeur entière
ainsi que deux arbres et renvoie un arbre dont la racine contient cette valeur et
les deux sous arbres sont ceux donnés en paramètre. ;
Solution :

Typedef struct noeud_s {


int valeur ;
struct noeud_s ∗ filsgauche ;
struct noeud_s ∗ filsdroit ;
} noeud_t ;
typedef noeud_t * arbre_B ;

arbre_B cree_arbre ( int v , arbre_B gauche , arbre_B d r o i t ) {


arbre_B A = malloc ( sizeof ( noeud_t ) ) ;
A->valeur = v;
A->filsgauche = gauche ;
A->filsdroi t = droit ;
return A ;
}

2. Écrire une fonction (récursive) detruit_arbre() qui libère la mémoire occupée


par tous les nœuds d'un arbre binaire.
Solution :
void detruit_arbre ( arbre_B A) {
i f ( A == NULL)
return ;
detruit_arbre ( A->filsgauche ) ;
detruit_arbre (A->filsdroit ) ;
free (A ) ;
}

3. Écrire une fonction (récursive) nombre_de_noeuds() qui calcule le nombre de


nœuds d'un arbre binaire.
Solution :
int nombre_de_noeuds ( arbre_B A ) {
i f ( A == NULL)
return 0 ;
return (1 + nombre_de_noeuds ( A->filsgauche )
+ nombre_de_noeuds ( A->filsdroit ) ) ;
}

Pr. M. E. RIFFI Page 1/7


4. Écrire une fonction compare() qui compare deux arbres binaires (la fonction
renvoie une valeur nulle si et seulement si les deux arbres binaires ont la même
structure d'arbre et qu'ils portent les mêmes valeurs aux nœuds correspondant).
Solution :
int compare ( arbre_B A1 , arbre_B A2 ) {
i f ( A1 == NULL) return ( A2 != NULL) ;
else {
if ( A2 == NULL return 1 ;
else return ( ( A1->valeur != A2->valeur )
| | compare ( A1->filsgauche , A2->filsgauche )
( | | compare ( A1->filsdr oit , A2->filsdroit ) ) ;
}
}

Exercice 2 :
1. Construire un Arbre Binaire de Recherche à éléments de type entier (ABR) sur
E = {1, 2, 6} ;
Solution :

1 1 2

2 6 1 6

6 2
6 6

1 2
1
2
2. Ecrire une fonction qui retourne le sommet de clé minimale d’un ABR ;
Solution :
Typedef struct noeud_s {
int valeur ;
struct noeud_s ∗ fgauche ;
struct noeud_s ∗ fdroit ;
} noeud ;
typedef noeud* ABR ;
ABR Min_sommet(ABR A)
{ if(A) if (A->fgauche ==NULL) return A;
else return Min_sommet(A->fgauche);
}

3. Ecrire une fonction qui permet d’insérer un nouveau sommet x dans un ABR;
Solution :
ABR insere(ABR A, int v)
{ if ( A == NULL)
{ ABR B = malloc ( sizeof ( noeud) ) ;
B->valeur=v;
B->fgauche=NULL;
B->fdroit=NULL;

Pr. M. E. RIFFI Page 2/7


A=B ;}
else {
if (v < A->valeur ) A->fgauche= insere(A->fgauche, v) ;
else if (v >A->valeur ) A->fdroit= insere(A->fdroit, v) ;
}
return A ;
}

4. Écrire une fonction trouve_noeud() qui renvoie l'adresse d'un noeud de l'ABR
donné en paramètre contenant une certaine valeur (ou NULL si cette valeur ne
figure pas dans l'arbre).
Solution :
ABR trouve_noeud ( ABR A , int v )
{
i f ( A == NULL) return NULL;
i f ( v == A->val eur ) return A ;
i f ( v < A->val eur ) return trouve_noeud ( A->fgauche , v ) ;
else return trouve_noeud ( A->fdroit , v ) ;
}
Exercice 3 :

1. Dans les deux exemples d’ABR, où peut-on insérer un élément de clé 13 ? (avec N
une feuille (sans clé))
Solution :

12 14

3 14 18
5
2 5 13 15 9
2 15 19
N N N N N N 13
N N N N N
N N N N
N N

Pr. M. E. RIFFI Page 3/7


2. Dans les deux exemples d’ABR, comment peut-on supprimer l’élément de clé 14 ?
Solution :
3.
4. 12 13
5.
6. 3 15
5 18
7.
8. 2 9
5 13
9. 2 15 19
10. N
11. N N N N N
N N N N N
12. N N
N
13. N

Exercice 4 :

1. Sur l’exemple de l’exercice 3, faire une rotation à droite de centre le nœud de clé
3; puis une rotation à gauche de centre le nœud de clé 14.
Solution :

12 12

2 14
3 14 RD(3)
3
15
2 5 15 5

14
RG(14) 12 15

2
3
5

Pr. M. E. RIFFI Page 4/7


2. Sur l’exemple de l’exercice 3, à l’aide de rotations dont vous préciserez le sens et
le centre, amener le nœud de clé 9 à la racine.
Solution :

14

5 18

15 19
2 9

14

9 18
RG(5)
5
15 19
2

14
RD(14) 5

2 18

15 19

3. Démontrer que toute rotation préserve la propriété d’être un arbre de recherche.


Solution :
Soit l’arbre binaire de recherche de l’exercice 4 :
C= xfilsdroit
y= xfilsgauche
A= yfilsgauche
B= yfilsdroit

Aval < yval <Bval <xval < Cval


Rotation droite de centre x donne :
A= yfilsgauche
B= xfilsgauche
x= yfilsdroit
C=xfilsdroit

Pr. M. E. RIFFI Page 5/7


On a toujours :
Aval < yval <Bval <xval < Cval
Et inversement si on applique une rotation gauche de centre y, on obtient le même
résultat.
Donc toute rotation préserve la propriété d’être un arbre de recherche.

Exercice 5 :

1. Dans l’arbre rouge noir donné, que valent Hn(30), Hn(20), Hn(35), Hn(50) ?
(Avec : pour x un nœud d’un arbre rouge noir. On appelle hauteur noire de x,
notée Hn(x), le nombre de nœuds noirs présents dans un chemin descendant de x
(sans l’inclure) vers une feuille de l’arbre).
Solution :
Hn(30) = 3
Hn(20) = 3
Hn(35) = 2
Hn(50) = 1
2. Montrer que, pour un nœud x quelconque dans un arbre rouge noir, le sous-arbre
enraciné à x contient au moins 2Hn(x) - 1 nœuds internes.
Solution :
Soit x un arbre rouge et noir vide, donc l’arbre contient 0 (= 2Hn(x) -1= 20 -1) nœud
interne.
Supposons que x un fils gauche, et un fils droit, donc :
Hn(xfilsgauche) < =Hn(x) -1
Hn(xfilsdroit) < =Hn(x) -1

 2Hn(xfilsgauche) <= 2Hn(x) - 1


2Hn(xfilsdroit) <= 2Hn(x) - 1
xfilsgauche contient au moins 2Hn(xfilsgauche) - 1 nœuds internes
xfilsgdroit contient au moins 2Hn(xfilsdroit) - 1 nœuds internes
 x a au moins :
2Hn(xfilsgauche) + 2Hn(xfilsdroit) - 1 <= 2Hn(xe)-1 + 2Hn(x)-1 - 1
= 2 2Hn(x) -1 - 1
= 2Hn(x) - 1 nœuds internes.
3. En déduire qu’un arbre rouge noir comportant n nœuds internes a une hauteur au
plus égale à 2 log(n + 1).
Solution :
Soit A un arbre rouge et noir, de hauteur h, donc d’après 2) A a : n= 2Hn(A) - 1
nœuds internes.
Or Hn(A) = h/2
 n = 2h/2 - 1  2h/2 = n + 1  h = 2 log(n + 1).

Pr. M. E. RIFFI Page 6/7


Exercice 6 :

1. Ecrire une fonction qui retourne vrai si deux sommets sont adjacents, dans un
graphe non orienté ;
2. Ecrire une fonction qui calcul le degré d’un sommet dans un graphe non
orienté ;
3. Ecrire une fonction qui retourne vrai si un sommet j est successeur d’un autre
sommet i, dans un graphe orienté ;
4. Ecrire une fonction qui calcul le degré extérieur d’un sommet, dans un graphe
orienté ;

Solution :
Solution de l’exercice dans le devoir n°2

Pr. M. E. RIFFI Page 7/7

Vous aimerez peut-être aussi