Académique Documents
Professionnel Documents
Culture Documents
Structure de données
arborescente : Les Arbres
1. Définitions
Déf 1:
Un arbre est une structure de données composée d’un ensemble de
nœuds reliés par des arcs et qui sont organisés sous forme
arborescente. Chaque nœud contient l’information spécifique de
l’application appelée étiquette (valeur ou clé) et des pointeurs vers
d’autres nœuds (d’autres sous-arbres).
Il existe une relation de parenté entre les nœuds. Un nœud père est
situé au dessus de ses nœuds fils. Un père est relié à ses fils par des
arcs.
Exemple:
Un arbre n-aire
1
03/05/2018
1. Définitions
On distingue trois types de nœuds :
les nœuds internes, qui ont des fils ;
les feuilles: les nœuds ne pointant vers aucun autre nœud, les
nœuds qui n'ont pas de fils ;
le nœud racine de l'arbre: le nœud qui n’est pointé par aucun
autre nœud, c’est l'unique nœud ne possédant pas de père.
1. Définitions
Une propriété intrinsèque de la structure des arbres est la récursivité, et
par conséquent les définitions des algorithmes qui les manipulent
s’écrivent très naturellement de manière récursive.
Déf 2: (Récursive)
Un arbre A est:
soit vide;
soit de la forme A = <v, A1, A2, A3, …, Ak>, où v est l’étiquette
du nœud racine A et A1, A2, A3, …, Ak sont des sous-arbres.
Un arbre n-aire
2
03/05/2018
1. Définitions
2. Vocabulaire employé sur les arbres
Niveau : le niveau de la racine est 0. Les autres nœuds ont un
niveau qui est augmenté de 1 par rapport au nœud dont ils
dépendent.
Chemin d'un nœud : On appelle chemin du nœud B la suite des
nœuds par lesquels il faut passer pour aller de la racine vers ce
nœud B.
Longueur d’un chemin : nombre des nœuds du chemin.
Hauteur (profondeur) d’un arbre : c’est le niveau maximum
atteint par la chemin le plus long +1. C’est le maximum des
longueurs des chemins.
Degré d’un nœud : le nombre de fils du nœud.
Degré d’un arbre: le maximum des degrés des nœuds de l’arbre.
Taille : C’est le nombre total de nœuds de l’arbre.
1. Définitions
2. Vocabulaire employé sur les arbres
Exemple:
1 - La racine est le nœud 1 de niveau 0.
- Les nœuds 2 et 3 sont de niveau 1.
2 3 - Chemin de 9 : 1 – 3 – 7 – 9
- 1 – 3 – 7- 9 est un chemin de
4 5 6 7 8 longueur 4
- Hauteur de 9 : h(9)=4
9 - Hauteur de 6 : h(6)=3
- Hauteur de la racine : h(1)=1
- Hauteur de l’arbre : 4
- Degré de 3 : 2
- Degré de l’arbre : 3 (arbre 3-aire)
- Taille de l’arbre : 9
- Les feuilles : 4, 5, 6, 8, 9
3
03/05/2018
2. Exemples d’applications
1. Expression arithmétique : arbre binaire ordonné
Une expression arithmétique ayant des opérateurs binaires peut
être schématisée sous la forme d’un arbre binaire. La Figure
suivante représente l’expression arithmétique :
((a+b) * (c-d) – e)
2. Exemples d’applications
2. Arbre lexicographique :
Un arbre lexicographique permet un rangement de mots par ordre
lexical (alphabétique).
Soient à représenter les mots suivants: mais, mars, mer, mon, sa,
son et sel. Les débuts communs peuvent n’être mémoriser qu’une
seule fois sous forme d’un arbre.
4
03/05/2018
2. Exemples d’applications
3. Arbres de répertoire:
Afin que les opérations d’accès, de recherche et de suppression
aux fichiers seront rapide, la mémoire est organiser d’une
manière hiérarchique sous forme d’un arbre de répertoire.
2. Exemples d’applications
3. Arbres généalogique : arbre n-aire
L’arbre généalogique suivant est un arbre de descendance. Julie a
deux enfants : Jonatan et Gontran. Jonatan a trois enfants :
Pauline, Sonia, Paul.
Le degré de l’arbre est de 3 ; l’arbre est dit 3-aire ou n-aire d’une
manière générale. Le degré de chaque nœud est variable puisqu’il
dépend du nombre d’enfants de ce nœud. Julie est la racine de
l’arbre.
5
03/05/2018
3. Arbres Binaires
1. Définition:
Un arbre binaire est un arbre dont chaque nœud a au maximum
deux fils, habituellement appelés «fils gauche» et «fils droit». Il
peut être défini récursivement de la manière suivante :
Un arbre binaire A est
soit vide;
soit de la forme A = <r, FG, FD>, où r est l’étiquette du
nœud racine A et FG et FD sont des sous-arbres binaires
disjoints.
3. Arbres Binaires
2. Spécification abstraite:
Soit A un arbre binaire des éléments de type Telement (type
générique), sa spécification abstraite est donnée par:
Sorte: ArbreBin
Paramètre: Telement
Utilise : Nœud, Entier, Booleen
Opérations:
créerArbreVide: →ArbreBin
racine : ArbreBin →Noeud
filsG : ArbreBin →ArbreBin
filsD : ArbreBin → ArbreBin
construireArbre : Noeudx ArbreBin x ArbreBin →ArbreBin
estVide : ArbreBin →Booleen
estFeuille : ArbreBin →Booleen
contenu: Noeud→Telement
Hauteur : ArbreBin → Entier ; Taille : ArbreBin → Entier
6
03/05/2018
3. Arbres Binaires
2. Spécification abstraite:
Sorte: ArbreBin
…
Préconditions: A: ArbreBin
racine(A) est définie ssi A ≠Ø
filsG(A) est définie ssi A ≠Ø
filsD(A) est définie ssi A ≠Ø
3. Arbres binaires
.3. Spécification opérationnelle:
Un arbre binaire peut se représenter au moyen d’un tableau ou bien
de structures chaînées. Dans les deux cas, il faut définir au
préalable le type abstrait des nœuds. C’est une structure à trois
champs : l’information (appelée aussi clé), le fils gauche et le
fils droit.
7
03/05/2018
3. Arbres binaires
typedef int Telement;
typedef struct Noeud {
Telement info;
int ifg, ifd;
} Noeud;
const int TMAX=6;
Ainsi on définit le tableau des noeuds arbreBin comme suit :
typedef Noeud arbreBin[TMAX];
Remarque :
L’absence de sous arbre gauche ou droit est représenté par la
valeur -1. Un arbre vide est représenté par un tableau dont l’indice
de sous arbre droit et gauche égal à -2.
info 12 1 91 32 67 45 50 7 61 40 82
ifg 1 2 3 -1 5 -1 -1 8 -1 -1 -1 -2 -2
ifd 7 4 -1 -1 6 -1 -1 10 9 -1 -1 -2 -2
3. Arbres binaires
Exemple:
indice 0 1 2 3 4 5 6 7 8 9 10 11 12
info 12 1 91 32 67 45 50 7 61 40 82
ifg 1 2 3 -1 5 -1 -1 8 -1 -1 -1 -2 -2
ifd 7 4 -1 -1 6 -1 -1 10 9 -1 -1 -2 -2
8
03/05/2018
3. Arbres binaires
3. Arbres binaires
int filsG(arbreBin A, int ir){
if (A[ir].ifg==-2){
printf("\nErreur.\n");
return -1;
}else
return A[ir].ifg;
}
int filsD(arbreBin A, int ir){
if (A[ir].ifd==-2){
printf("\nErreur.\n");
return -1;
}else
return A[ir].ifd;
}
9
03/05/2018
3. Arbres binaires
int construireArbre(Noeud Nd, arbreBin A,
int irfg, int irfd){
int i;
Nd.ifg=irfg;//indice de la racine du fils g
Nd.ifd=irfd;//indice de la racine du fils d
i=0;
while((A[i].ifg !=-2)&&(i<TMAX))
i++;
if (i < TMAX){
A[i] = Nd;
return i;//indice du racine
}else{
printf("\nPleinne\n");
return -1;
}}
3. Arbres binaires
10
03/05/2018
3. Arbres binaires
int maxi(int a, int b){return (a>b)?a:b;}
int hauteur(arbreBin A, int ir){
if (estVide(A, ir))
return 0;
else
return 1+ maxi(hauteur(A,filsG(A,ir)),
hauteur(A,filsD(A,ir)));
}
int taille(arbreBin A, int ir){
if (estVide(A, ir))
return 0;
else
return 1+ taille(A,filsG(A,ir))+
taille(A,filsD(A,ir));
}
3. Arbres binaires
Exemple 2: Arbre d’une expression arithmétique
11
03/05/2018
Implémtation:
La déclaration des types constituant le maillon (l’élément de
base d’un arbre) est la suivante :
typedef int Telement;
typedef struct Noeud {
Telement info;
struct Noeud *pfg, *pfd;
} Noeud;
12
03/05/2018
13
03/05/2018
La fonction taille qui determine le nombre des noeuds d’un arbre binaire.
14
03/05/2018
. A. Parcours en profondeur:
Parcours préfixe.
Le parcours préfixe est décrit récursivement :
Visiter le père (la racine) ;
Visiter le sous-arbre gauche en parcours préfixe;
Visiter le sous-arbre droit en parcours préfixe.
. A. Parcours en profondeur:
Parcours infixe.
Le parcours infixe est décrit récursivement :
Visiter le sous-arbre gauche en parcours infixe;
Visiter le père (la racine) ;
Visiter le sous-arbre droit en parcours infixe.
15
03/05/2018
. A. Parcours en profondeur:
Parcours postfixe.
Le parcours postfixe est décrit récursivement :
Visiter le sous-arbre gauche en parcours postfixe;
Visiter le sous-arbre droit en parcours postfixe;
Visiter le père (la racine) .
16
03/05/2018
A. Parcours en largeur:
Le parcours en largeur des arbres binaires consiste à les visiter
niveau par niveau de gauche à droite. C’est un algorithme classique
consiste à explorer chaque nœud d'un niveau donné de gauche à
droite, puis de passer au niveau suivant. Ce peut être décrit en
utilisant une file.
17
03/05/2018
Un arbre binaire parfait est un arbre binaire dont tous les niveaux sont
complètement remplis, sauf éventuellement le dernier niveau des feuilles, et dans
ce cas les feuilles sont groupées le plus gauche possible.
32 - 91 - 1 - 45 - 6 7 - 50 - 12 - 61 - 40 - 7 - 82
32 - 91 - 1 - 45 - 6 7 - 50 - 12 - 61 - 40 - 7 - 82
18
03/05/2018
racine(ConstruireArbre(r,fg,fd)) = r
filsG(ConstruireArbre(r,fg,fd)) =fg
filsD(ConstruireArbre(r,fg,fd)) =fd
Hauteur(créerArbreVde())=0
Taille(créerArbreVide())=0
19
03/05/2018
Spécification opérationnelle :
typedef int Telement;
typedef struct Noeud {
Telement info;
struct Noeud *fg, *fd;
} Noeud;
Version iterative:
int existeElI(arbreBR A, Telement e) {
arbreBR temp;
temp=A;
while((temp != NULL) && (e!= temp->info)){
if (e<temp->info)
temp = temp->fg;
else
temp = temp->fd;
}
return temp !=NULL;
}
Recherche:
Noeud * recherche(arbreBR A, Telement e){
if (A==NULL)
return NULL;
else if ( e == A->info)
return A;
else if ( e < contenu(A))
return recherche(A->fg, e);
else
return recherche(A->fd, e); }
20
03/05/2018
21
03/05/2018
22
03/05/2018
- Si le nœud Nd a deux fils: Sa valeur sera remplacer par celle du nœud qui a
la plus grande valeur du sous arbre gauche (ou la plus petite valeur du sous-
arbre droit) et de supprimer le nœud associé dans le sous arbre gauche (ou
droit) .
23
03/05/2018
24
03/05/2018
25
03/05/2018
2. Rotations et équilibrage:
Chaque fois qu'un nœud est inséré ou supprimé d'un arbre AVL, le facteur
d'équilibrage de chaque nœud le long du chemin depuis la racine jusqu'au nœud
inséré (ou supprimé) doit être recalculé.
Si l'arbre est resté équilibré, il n'y a rien à faire. Si ce n'est pas le cas, on
effectuera des rotations d'équilibrage de manière à obtenir à nouveau un arbre
AVL.
Def: Une rotation est une modification locale d'un arbre binaire. Elle consiste à
échanger un nœud avec l’un de ses fils.
Dans la rotation droite, un nœud devient le fils droit du nœud qui était son fils
gauche.
Dans la rotation gauche, un nœud devient le fils gauche du nœud qui était son
fils droit.
26
03/05/2018
Types de rotations :
Une rotation simple droite est utilisée quand un nœud a un facteur d'équilibrage
inférieur à -1 et que son fils gauche a un facteur d'équilibrage de -1.
Types de rotations :
27
03/05/2018
Types de rotations :
Types de rotations :
28
03/05/2018
Double rotation:
29
03/05/2018
On peut montrer qu'il suffit d'une rotation simple ou d'une double rotation pour
rééquilibrer un arbre AVL après une insertion.
La suppression peut se faire par la même façon que dans les arbres binaires de
recherche puis on fait appel à la fonction equilibrer.
Remarques:
Après chaque insertion ou suppression, il faut appeler la fonction equilibrer
pour équilibrer l’arbre.
La recherche dans un arbre AVL se déroule exactement comme pour un
arbre binaire de recherche, et comme la hauteur d'un arbre AVL est en
O(log(n)), elle se fait donc en O(log(n))..
30
03/05/2018
6. Arbre n-aires
Def: Un arbre n-aire est composé d’un nœud racine est d’un ensemble pouvant être
vide de nœuds fils qui définissent récursivement des sous-arbres n-aires.
Propriètés
Listes : un “successeur” suivant
Arbres binaires : deux “successeurs” ordonnés filsG et filsD
Arbres n-aires : n successeurs fils1,fils2, ..., filsn
Représentation:
Deux cas possibles
Nombre de successeurs borné: on sait à l’avance que chaque sommet aura N
successeurs au plus, dans ce cas l’ensemble des successeurs peut être
représentée par un tableau des sous arbres n-aires. Un arbre est donc est
représenté par un couple (info, tableau-de-fils).
Nombre de successeurs arbitraire : on ne peut pas prévoir à l’avance le
nombre de successeurs, dans ce cas l’ensemble des successeurs est
représentée par une liste chaînée d’arbres. un arbre est représenté donc
comme un couple (info , liste-de-fils).
31