CHAPITRE3
CHAPITRE3
CHAPITRE3
3. Représentation et implémentation.........................................................................14
3.1. Arbre binaire de recherche .............................................................................................................14
3.2. Arbre binaire de recherche équilibré AVL( Adelson-Velskii et Landis) ..........................................15
3.3. Arbre général ...................................................................................................................................20
2
Chapitre 3 : Les Arbres I
3
Chapitre 3 : Les Arbres
1. Rappels d'arbres
1.1. Qu'est ce qu'un arbre ?
Un arbre est une structure de données hiérarchique qui est composée de nœuds reliés par des arêtes. il
ressemble à un arbre réel avec des branches et des feuilles. Dans une structure de données
arborescente, il existe un nœud unique appelé Racine, qui sert de point de départ. Chaque nœud de
l'arbre peut avoir zéro au plusieurs nœuds Enfants, formant ainsi une structure en branches.
1. Racine : Le nœud le plus élevés dans un arbre. Il sert de point de départ pour parcourir l'arbre.
2. Enfant : Un nœud directement connecté à un autre nœud en sʼéloignant de la racine.
3. Parent : L'inverse d'un enfant . Un nœud est le parent de ses nœuds enfants.
4. Frère ou sœur : Des nœuds qui partagent le même père.
5. Feuille : Un nœud qui n'a pas d'enfants.
Un arbre
Les nœuds internes dans la figure peuvent être des parents, enfants et des frères ou sœurs
4
Chapitre 3 : Les Arbres
2. Arbres binaires
2.1. C'est quoi un arbre binaire ?
Définition
Un arbre binaire est un arbre de degré 2 ou chaque nœuds a au plus deux fils. Le premier fils est
appelé Fils -Gauche (FG) et le deuxième fils est appelé Fils-Droit (FG).
Par exemple sur la figure ci-dessous, le nœud A possède deux sous-arbres : : sous-arbre gauche et sous-
arbre droit.
Arbre binaire
Remarque
Les arbres binaires sont utilisés pour traiter des données. Chaque nœud peut donc être représenté par
la donnée qu'il contient. Ainsi, dans l'arbre de l'exemple , la donnée contient des caractères (A à J).
Compte tenu de la nature récursive d'un arbre, la représentation la plus couramment utilisée est celle
chaînée dont le principe est de désigner un arbre binaire par un ensemble de cellules mémoire à trois
champs :
FG Val FD
5
Chapitre 3 : Les Arbres
Remarque
Un arbre binaire parfait est un arbre dans lequel chaque niveau est complètement rempli, à l'exception
éventuelle du dernier niveau, qui est rempli de gauche à droite. Cependant, si le dernier niveau n'est
pas complètement rempli, les nœuds présents sont regroupés à gauche de l'arbre.
Un arbre binaire est dégénéré si chacun de ses nœuds internes n'a qu'un seul descendant ( gauche ou
droit). Un arbre binaire dégénéré est un arbre formé uniquement de points simples: c'est une liste.
6
Chapitre 3 : Les Arbres
Un arbre binaire est complet lorsque son nombre de nœuds est 2H-1 où H est sa hauteur.
Un arbre binaire de recherche est une structure de données qui permet de représenter un ensemble de
clés si l'on dispose d'une relation d'ordre sur ces clés. Autrement dit chaque nœud possède une valeur
plus grande que tous les nœuds qui forment son sous-arbre gauche et plus petit que tous les nœuds
qui forment son sous arbre droit. Autrement dit, un arbre binaire de recherche (ABR) est un arbre
binaire ordonné tq : FG (x) < x < FD (x). On peut aussi imaginer la relation inverse, i.e. FG (x) > x > FD (x).
7
Chapitre 3 : Les Arbres
8
Chapitre 3 : Les Arbres
9
Chapitre 3 : Les Arbres
Parcours infixe
1 procédure infix (b : arbre_binaire) ;
2 Si (b <> NIL) Alors
3 infix (b↑.FG) ;
4 ecrire (b↑.Val) ;
5 infix (b↑.FD)
6 Fin Si
Parcours suffixe
1 procédure suffix (b : arbre_binaire) ;
2 Si (b <> NIL) Alors
3 suffix (b↑.FG) ;
4 suffix (b↑.FD);
5 ecrire (b↑.Val) ;
6 Fin Si
10
Chapitre 3 : Les Arbres
11
Chapitre 3 : Les Arbres
12
Chapitre 3 : Les Arbres
Dans l'exemple, le plus grand descendant gauche est 73 , alors remplacer 76 par 73 et remplacer 73 par
son fils gauche qui est le sous arbre qui contient les nœuds 72,71
13
Chapitre 3 : Les Arbres
3. Représentation et implémentation
3.1. Arbre binaire de recherche
Un arbre binaire de recherche peut être représenté de différentes manières en utilisant une structure
de données dynamique ou une structure de données statique.
1. Représentation statique
Il existe deux catégories de représentations internes statiques : la représentation statique standard et
la représentation statique séquentielle.
-Le modèle statique standard permet de représenter explicitement les nœuds fils comme sur la figure
ci-dessous :
-Le modèle statique séquentiel permet de représenter implicitement les nœuds fils. Le nœud à la
position P est le père implicite des nœuds aux positions 2P et 2P+1.
2. Représentation dynamique
Dans la représentation dynamique d'un arbre binaire chaque nœud possède deux pointeurs : un vers le
sous arbre gauche et un autre vers le sous arbre droit. L'arbre est déterminé par l'adresse de sa racine.
Cette représentation est réalisée par les listes chaînées.
La représentation mémoire de l'arbre abstrait de l'expression a * (c + d) par une liste chaînée non
linéaire est illustrée par la figure suivante :
14
Chapitre 3 : Les Arbres
Arbres AVL
Les valeurs autorisées de facteur d'équilibre (BF) sont –1, 0 et +1.
-La valeur –1 indique que le sous-arbre de droite en contient un supplémentaire, c'est-à-dire que
l'arbre est lourd à droite.
-La valeur +1 indique que le sous-arbre de gauche contient un extra, c'est-à-dire que l'arbre est laissé
lourd.
-La valeur 0 montre que l'arbre comprend des nœuds égaux de chaque côté, c'est à dire que l'arbre est
parfaitement équilibré.
La représentation d'un arbre binaire équilibré suit généralement les mêmes représentation d'un
arbre binaire (représentation statique et dynamique).
15
Chapitre 3 : Les Arbres
16
Chapitre 3 : Les Arbres
Cas de –2, 1 : Rotation double gauche droite dʼoù les rotations suivantes :
17
Chapitre 3 : Les Arbres
Ajout de la valeur 14 :comme fils droit de 6 et fils droit de 10 et fils droit de 12.
Ajout de la valeur 8 : comme fils droit de 6 et fils gauche de 12 et fils gauche de 10.
18
Chapitre 3 : Les Arbres
3- Suppression d'un élément : La suppression est également très simple. Nous supprimons en
utilisant la même logique que dans les arbres binaires de recherche. Après suppression, nous
restructurons l'arbre, si nécessaire, pour conserver sa hauteur équilibrée.
Étape 1: Trouvez l'élément dans l'arborescence.
Étape 2: Supprimez le nœud, conformément à la suppression dans un arbre binaire de recherche.
Étape 3: Deux cas sont possibles :
Cas 1: SUPPRESSION DE SOUS-ARBRE DROIT :
1A. Si BF(node) = +2 et BF(node -> le -child) = +1, effectuez une rotation RR( rotation droite).
1B. Si BF(node) = +2 et BF(node -> le -child) = -1, effectuez une rotation LR (double rotation gauche-
droite).
1C. Si BF(node) = +2 et BF(node -> le -child) = 0, effectuez une rotation RR (rotation droite)
19
Chapitre 3 : Les Arbres
20
Chapitre 3 : Les Arbres
3.3.1 Parcours
Les parcours les plus communément utilisés sont :
Parcours infixe : consiste à visiter le sous_arbre gauche, puis la racine et enfin le sous arbres droit : T1,
Racine ,T2 ... Tn
Parcours préfixe: consiste à visiter la racine , puis le sous_arbre de gauche à droite : Racine,T1 T2 ... Tn
Parcours suffixe: consiste à visiter le le sous_arbre de gauche à droite puis la racine :T1 T2 ... Tn, Racine
B- Liaison des nœuds frères dans une liste linéaire chaînée (les liens en rouge ) .
21
Chapitre 3 : Les Arbres
22
Chapitre 3 : Les Arbres
2- Représentation par un tableau et une liste : On peut remédier à la perte d'espace engendrée par la
représentation statique standard en adoptant un autre modèle de représentation. On utilise, à cet effet,
un tableau de nœuds (statique). Ensuite, à chaque nœud est associée la liste de ses fils (dynamique).
C'est la représentation semi statique ou semi dynamique.
3- Représentation statique dense : On peut également adopter une autre représentation nommée
représentation statique dense dite aussi représentation par index_parent comme illustré par la table
de la figure ci-après :
4- Représentation dynamique par une liste chaînée : on peut représenter l'arbre général de manière
purement dynamique par une liste chaînée après l'avoir transformé en un arbre binaire. Ci-après le
modèle de représentation :
5- Représentation sous forme d'une matrice d'adjacence : Dans une représentation en matrice
d'adjacence, chaque nœud de l'arbre est représenté par une ligne de la matrice. La colonne i de la ligne
j indique si le nœud j est un enfant du nœud i.
23
Chapitre 3 : Les Arbres
Remarque
La représentation d'un arbre général en mémoire est choisie en fonction de l'application. Par exemple
une liste chaînée est une bonne représentation pour un arbre général dans lequel l'ordre des nœuds
n'est pas important. Un arbre binaire est une bonne représentation pour un arbre général dans lequel
chaque nœud a au plus deux enfants. Une matrice d'adjacence est une bonne représentation pour les
arbres généraux dans lesquels l'ordre des nœuds est important.
L'implémentation d'un arbre général adoptant la représentation dynamique "liste chaînée" est donnée
par le pseudo-code suivant :
1 type arbre_général =^ noeud
2 noeud= structure
3 Val: élément;// stocke la valeur du noeud
4 enfant:arbre_général;// enfant:pointe vers le premier enfant du noeud (s'il en a)
5 frére_suivant: arbre_général;//frére_suivant:pointe vers le noeud suivant
6 // de méme niveau
7 finstructure
8
9 Variables A:arbre_général;
10
24
Chapitre 3 : Les Arbres
Procédure Ajout_enfant ()
1 Procedure Ajout_enfant (var parent, enf: arbre_général);
2 var noeud_courant: arbre_général;
3 Début
4
5 Si parent↑.enfant= NIL alors // cas d'ajout du premier enfant à un noeud parent
6 parent↑.enfant <- enf // pointer vers le noeud enfant
7
8 Sinon //cas d'ajout du deuxiéme enfant au meme parent
9 début
10
11 noeud_courant <- parent↑.enfant;// noeud_courant est un pointeur de type
12 // arbre_général
13 Tant que noeud_courant↑.frére_suivant <> NIL faire // ceci est executé si par
14 // exemple un noeud contient
15 // plus de deux enfants
16 noeud_courant <- noeud_courant↑.frére_suivant;
17 Ftq;
18
19 noeud_courant↑.frére_suivant <- enf; //relier l'enfant a son frére_suivant
20 finSinon
21 finsi
22 Fin
Arbre général A
25
Chapitre 3 : Les Arbres
-Ajout_enfant (racine, enfant1) ;c-à-d : Ajout_enfant (1, 2) exécution de si: (1↑. enfant <- 2),comme la
montre la figure suivante :
-Ajout_enfant (racine, enfant2) ;c-à-d : Ajout_enfant (1, 3) , exécution de sinon, nœud_courant <- 1↑.
enfant=2 et 2↑. frère_suivant<- 3 ; comme la montre la figure suivante :
26
Chapitre 3 : Les Arbres
-Ajout_enfant (racine, enfant3) ;c-à-d : Ajout-enfant (1,5), exécution de sinon, nœud_courant <- 1↑.
enfant=2,exécution de la boucle tant que car 2↑. frère_suivant= 3<> Nil : nœud_courant pointe vers
3, on sort de la boucle tant que. 3↑. frère_suivant<- 5. Comme est illustré dans la figure suivante :
-Ajout_enfant (enfant1, enfant4) ;c-à-d Ajout(2,4),exécution de si, 2↑. enfant<-4. Comme la montre la
figure suivante :
27
Chapitre 3 : Les Arbres
2- Suppression d'un élément : Le principe de la suppression d'un élément dans un arbre général est le
suivant :
Rechercher lʼélément à supprimer afin de le localiser dans l'arbre.
Gérer les liens parentaux.
Gérer les liens enfants.
Libérer la mémoire.
Cas d'une feuille : Si la feuille contient des frères le nœud parent garde les relations avec les frères de
la feuille sinon il pointe vers NIL.
28
Chapitre 3 : Les Arbres
Cas d'un nœud interne : les enfants du nœud interne deviennent les enfants du nœud parent.
29
Chapitre 3 : Les Arbres
3-Ajout d'un élément : Le principe de l'ajout d'un nœud dans un arbre général est le suivant :
Localisation du nœud parent : identifier le nœud existant auquel le nouveau nœud sera rattaché
(recherche du nœud parent).
Création du nouveau nœud.
Attachement du nouveau nœud au nœud parent.
Mettre à jour les références entre les nœuds.
30
Chapitre 3 : Les Arbres
En résumé, les arbres AVL garantissent un équilibre qui maintient la complexité à O(log n) pour les
opérations de base, tandis qu'un arbre binaire de recherche ordinaire peut dégénérer dans le pire des
cas. Les arbres généraux n'ont généralement pas de propriétés d'équilibre, ce qui peut conduire à des
performances moins prévisibles.
Définition
Un tas (heap en anglais) est un arbre qui vérifie les deux propriétés suivantes :
1. C'est un arbre binaire parfait c'est-à-dire un arbre binaire dont tous les niveaux sont remplis sauf
éventuellement le dernier où les éléments sont rangés le plus à gauche possible.
2. il est ordonné en tas :On dit qu'un arbre est ordonné en tas lorsque la propriété suivante est vérifiée :
les nœuds sont ordonnés par leurs clés respectives,
On parle d'un tas-max (Max-heap) si tout nœud a une valeur plus grande ou égale à celles de
ses deux fils. Pour tous A et B nœuds de l'arbre tels que B soit un fils de A, clé(A) ≥ clé(B). Dans ce
cas, le plus grand élément de l'arbre est à la racine.
On parle d'un tas-min (Min-heap) si tout nœud a une valeur plus petite ou égale à celles de ses
deux fils. Pour tous A et B nœuds de l'arbre tels que B soit un fils de A, clé(A) <= clé(B). Dans ce
cas, le plus petit élément de l'arbre est à la racine.
3. L'élément le plus prioritaire se trouve donc toujours à la racine.
Exemple d'un tas-max
31
Chapitre 3 : Les Arbres
-L'arbre A n'est pas un tas car il n'est pas parfait calé à gauche.
-L'arbre B n'est pas un tas car il viole la propriété de tas , un nœud de valeur 10 ne devrait pas être le fils
d'un nœud de valeur 9.
32
Chapitre 3 : Les Arbres
33
Chapitre 3 : Les Arbres
Remarque
La recherche d'un élément dans un tas n'est pas très efficace. Les tas sont généralement utilisés pour
des opérations d'insertion et dʼextraction. Si la recherche est une opération fréquentes ,d'autres
structures de données comme les ABR sont plus appropriées.
On prend la suite de nombres suivante que l'on va trier dans l'ordre croissant avec le tri par tas : 1, 9, 3,
7, 6, 1, 4.
-1ère étape : créer le tas (max dans notre cas)
34
Chapitre 3 : Les Arbres
35
Chapitre 3 : Les Arbres
36