Beruflich Dokumente
Kultur Dokumente
Correction TD 4
Les arbres
1
Structure de données d’un arbre binaire
} arb;
typedef arb * arbre;
2
Exercice 1: Arbre binaire de recherche
101, 144, 4096, 153, 3025, 2048 101, 153, 4096, 144, 3025, 2048 4096, 101, 144, 153, 3025, 2048
153
153 3025
3025 3025
2048
2048 2048
3
Exercice 4
4
arbre creer_noeud (int el)
{
arbre nod;
if (((nod)= (arbre ) malloc (sizeof(arb)))== NULL)
5
arbre fusion (arbre A1, arbre A2)
{
if(A2!=NULL)
{
A1=ajouter(A1, A2val);
A1=fusion(A1, A2fg);
A1=fusion(A1, A2fd);
}
return(A1);
}
6
arbre fusion (arbre A1, arbre A2) A1
{
if(A2!=NULL) 153
{
A1=ajouter(A1, A2val); 409
A1=fusion(A1, A2fg);
144
A1=fusion(A1, A2fd);
} 90
return(A1);
} A2
@1
140
@2 @3
145
80
7
A1
{
409
if(@1!=NULL) 144
{
A1=ajouter(A1, @1val); 90
A1=fusion(A1, @1fg);
A1=fusion(A1, @1fd); A2
@1
} 140
return(A1); @2 @3
145
80
}
A1
153
409
144
90
140
8
A1
153
} @2 @3
145
80
// @1fg correspond à @2
9
A1
153
if(@2!=NULL)
{ 90
A1=ajouter(A1, @2val);
A1=fusion(A1, @2fg); 140
A1=fusion(A1, @2 fd); A2
} @1
return(A1);
140
@2 @3
145
} 80
153
A1
409
144
90
140
80 10
153 A1
if(@2!=NULL)
{ 90
A1=ajouter(A1, @2val);
A1=fusion(A1, @2fg); 80 140
A1=fusion(A1, @2 fd);
} A2
return(A1); @1
140
} @2 @3
145
80
// @2fg correspond à NULL
// pas de modifications sur l’arbre
11
A1
153
if(@2!=NULL)
{ 90
A1=ajouter(A1, @2val);
A1=fusion(A1, @2fg); 80 140
A1=fusion(A1, @2 fd);
} A2
return(A1); @1
140
} @2 @3
145
80
// @2fd correspond à NULL
// pas de modifications sur l’arbre
12
A1
153
if(@1!=NULL)
{ 90
A1=ajouter(A1, @1val);
A1=fusion(A1, @1fg); 80 140
A1=fusion(A1, @1fd);
} A2
return(A1); @1
140
} @2 @3
145
80
// @1fd correspond à @3
13
A1
153
if(@3!=NULL)
{ 90
A1=ajouter(A1, @3val);
A1=fusion(A1, @3fg); 80 140
A1=fusion(A1, @3fd); A2
} @1
return(A1); 140
@2 @3
} 80
145
A1
153
409
144
90 145
80 140 14
A1
153
if(@3!=NULL)
{ 90 145
A1=ajouter(A1, @3val);
A1=fusion(A1, @3fg); 80 140
A1=fusion(A1, @3fd);
}
return(A1);
A2
@1
} 140
@2 @3
// @3fg correspond à NULL 80
145
15
A1
153
if(@3!=NULL)
{ 90 145
A1=ajouter(A1, @3val);
A1=fusion(A1, @3fg); 80 140
A1=fusion(A1, @3fd);
}
return(A1);
A2
@1
} 140
@2 @3
// @3fd correspond à NULL 80
145
16
Exercice 2
17
Remplacement de
Cas 1 Cas 2 la valeur du nœud Cas 3
à supprimer par la
140
153
valeur la plus 153
grande dans le
sous arbre gauche
80 145 144 144
409 409
90 90 150
40 140
140
150
145 153
144 409
90 409
90 150
40 140
Suppression du noeud 150
avec la couleur rouge
18
void supprimer(arbre *A, int val)
{
arbre t;
if(*A!=NULL)
{
if((*A)val==val)
{// 1er cas: feuille
if(((*A)fg==NULL)) &&((*A)fd==NULL))
{
t=*A;
*A=NULL;
free(t);
}
else if ((*A)fd==NULL)
{//2eme cas: Seulement un fils à gauche
t=*A;
*A=(*A)fg;
free(t);
}
19
else if ((*A)fg==NULL)
{//3eme cas: Seulement un fils à droite
t=*A;
*A=(*A)fd;
free(t);
}
else
{//4 eme cas : un fils à gauche et un fils à droite
// remplacer le nœud avec la valeur la plus
//grande dans le sous arbre à gauche
for (t=(*A)fg; tfd!=NULL; t=tfd);
(*A)val=tval;
supprimer(&((*A)fg),tval);
}
}
else if((*A)val>val)
supprimer(&((*A)fg),val);
else supprimer(&((*A)fd),val);
}
}
20
Exercice 3 A1 A2
a-
int est_equilibre(arbre A1, arbre A2) 140 140
{
if(A1==NULL) 80 145 80 145
return(A2==NULL);
if(A2==NULL)
return(0);
if(A1val==A2val)
return(est_equilibre(A1fg, A2fg)
&&est_equilibre(A1fd, A2fd));
return(0);
21
b-
Avant de présenter le code de la fonction qui permet de vérifier si un arbre
est inclus dans un autre, nous commençons par introduire la fonction
int est_equilibre_inc(arbre A1, arbre A2)
{
if(A2==NULL) 80 145
return(1);
if(A1==NULL) A1
return(0);
if(A1val==A2val) 140
return(est_equilibre_inc(A1fg, A2fg)
&&est_equilibre_inc(A1fd, A2fd)); 80 145
return(0);
} 60
22
160
A1
140 200
int est_inclus(arbre A1, arbre A2)
// tester si A2 est inclus dans A1
{ 80 145
if(A1==NULL)
return(0); 60
A2
if(A2==NULL)
return(1); 140
if(est_equilibre_inc(A1,A2))
return(1);
return(est_inclus(A1fg, A2)
80 145
||est_inclus(A1fd, A2));
}
23