Vous êtes sur la page 1sur 12

21/04/2019

LES ARBRES BINAIRES Algorithme et structure de


données

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 1

INTRODUCTION
 Un arbre binaire est une structure constituée par une racine et par deux sous-arbres vide ou non,
le sous-arbre gauche et le sous-arbre droit.
 un arbre vide est un arbre particulier qui ne comporte ni racine, ni sous-arbres.
Un arbre binaire complet est un arbre binaire où tout nœud interne a deux enfants. Càd possède 0 ou 2 fils.
Un arbre binaire parfaite: pour le dernier niveau si un nœud possède un seul fils, alors celui-ci placé à
gauche.
Un arbre binaire plein: est un arbre binaire où chaque nœud possède exactement 2 fils, sinon le nœud est
obligatoirement une feuille.

Racine

SAG SAD
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 2
21/04/2019

OPÉRATIONS SUR LES ARBRES


Il existe un certain nombre d'opérations classiques sur les arbres :

Tester si l’arbre est vide ou non


Créer un arbre
Créer une feuille
Supprimer un nœud
Supprimer un arbre
Accéder à une valeur qui se trouve dans la racine.
etc..

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 3

IMPLÉMENTATION
1. Déclaration
La représentation de la structure de données arbre binaire est constituée de 2 parties:
 une pour représenter :
o un nœud qui contient une valeur,
o un pointeur vers le nœud gauche appelé aussi fils gauche
o un pointeur vers le nœud droit ou le fils droit ;
 une autre partie qui constitue la représentation de l’arbre sous forme d’un pointeur vers un nœud qui
est la racine.
Type
Nœud = structure
valeur : typeValeur
FilsGauche : ^Nœud
FilsDroit : ^Nœud
Fin Structure

ArbreBinaire :^Nœud
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 4
21/04/2019

IMPLÉMENTATION
2. Création d’un arbre binaire vide
La fonction CréerArbreVide crée et retourne un arbre vide, il suffit de déclarer un
pointeur sur un arbre binaire et l’initialiser à la valeur NIL.

Fonction CréerArbreVide () : ArbreBinaire


Var
A
A : ArbreBinaire
Début
A <- NIL
retourner(A)
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 5

IMPLÉMENTATION
3. Création d’une feuille
La fonction CréerFeuille permet de créer un nœud externe contenant une valeur, et
retourne sa position en mémoire.

Fonction CréerFeuille (e : entier) : ArbreBinaire


Var feuille
feuille: ArbreBinaire
Début
Allouer (feuille) e
feuille^.valeur <- e
feuille^.fils_gauche <- Nil
feuille^.fils_droit <- Nil
retourner(feuille)
Fin
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 6
21/04/2019

IMPLÉMENTATION
4. Création d’un arbre
La fonction CréerArbre permet de créer un arbre à partir d’un sous-arbre droit et
d’un sous-arbre gauche existants, et d’un élément qui présente la valeur de la racine.

Fonction CréerArbre (e : entier, SAG:ArbreBinaire, SAD:ArbreBinaire ) : ArbreBinaire pere


Var
pere: ArbreBinaire
Début
e
Allouer (pere)
pere^.valeur <- e
pere^.fils_gauche <- SAG
pere^.fils_droit <- SAD SAG SAD
retourner(pere)
Fin
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 7

IMPLÉMENTATION
5. Test arbre binaire vide
Teste si un arbre binaire est vide ou non.

Fonction ArbreBinaireVide (A : Arbre_binaire) : Booleen


Début
Si (A = Nil) Alors
retourner (Vrai)
Sinon
retourner (Faux)
FinSi
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 8


21/04/2019

IMPLÉMENTATION
6. Accès à la racine
La fonction suivante récupère la valeur contenue dans le nœud racine d’un arbre.

Fonction Racine (A: Arbre_Binaire) : entier


Debut
Remarque
Si (A<>Nil) alors
Pour pouvoir accéder aux valeurs des autres nœuds, il faut
Retourner (A^.valeur)
d’abord les transformer en racines. Ex. soit x un nœud de
Sinon
l’arbre, pour accéder à la valeur de x, il faut se déplacer dans
Ecrire (« l’arbre est vide »)
l’arbre jusqu’à atteindre le sous-arbre qui a pour racine.
FinSi
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 9

IMPLÉMENTATION
7. Suppression d’un arbre
La fonction suivante permet de détruire la totalité de l’arbre ou du sous-arbre dont la
position en mémoire est fournie en paramètre: cette position est celle de la racine.

Procédure SupprimeArbreBinaire (A: Arbre_Binaire)


Debut
Si (ArbreBinaireVide() = Faux ) alors
SupprimeArbreBinaire (A^.fils_gauche)
SupprimeArbreBinaire (A^.fils_droit)
Liberer(A)
FinSi
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 10


21/04/2019

EXERCICE 0
1

1 5
7

Soit A l’arbre binaire, nous allons créer cet arbre en employant les primitives définies et implémentées ci-dessus:

Alghorithme CreerArbreBinaire
Var
A,B,C : ArbreBinaire
Début
A <- CréerArbre(1,CreerFeuille(0), CreerFeuille(1))
B <- CréerArbre(7,CreerFeuille(5), CreerFeuille(9))
C <- CréerArbre(2,A,B)
Fin

L’algorithme est constitué de trois instructions:


• La création de l’arbre A
• Ensuite l’arbre B
• Finalement l’arbre C

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 11

EXERCICE
L’arbre A est d’abord créé grâce à la primitive CréerArbre qui prend pour paramètre:
• la racine 1,
• un sous arbre gauche résultat de la création de la feuille 0,
• un sous-arbre droit qui est le résultat de la création de la feuille 1.
Ensuite un autre arbre B est crée qui a pour :
• racine 7
• sous-arbreles feuilles 5 et 9
Finalement un arbre C est crée à partir de:
• la racine 2
• des deux sous-arbres A et B.

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 12


21/04/2019

EXERCICE
2éme Solutions:
Alghorithme CreerArbreBinaire
Var
A,B,C : ArbreBinaire
Début
A <- CréerArbre(1, CréerArbre(0,Nil,Nil), CréerArbre(1,NIL,NIL))
B <- CréerArbre(7, CréerArbre(5,Nil,Nil), CréerArbre(9,Nil,Nil))
A <- CréerArbre(2,A,B)
Fin

• Le résultat de CréerFeuille( e) est le même que celui de CréerArbre(e,Nil,Nil) puisqu’une feuille n’est rien d’autre
qu’un arbre possédant deux sous-arbres gauche et droit vides.
• Même si les deux algorithmes produisent le même résultat la première version est plus lisible et moins complexe,
puisqu’on ne spécifie qu’un seul paramètre pour la fonction CréerFeuille.

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 13

LE PARCOURS D’ARBRES BINAIRES


1. Définition

Le parcours sert à explorer un arbre, c’est-à-dire visiter un par un tous les nœuds.
 Lors d’exploration un nœud peut être passé en revue une ou plusieurs fois.
 Il ne faut cependant pas dépasser trois passages pour un même nœud.

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 14


21/04/2019

LE PARCOURS D’ARBRES BINAIRES


2. Objectif

Est de donner la liste des nœuds de l’arbre.


Si l’arbre est vide alors on obtient une liste vide.
Ils existe deux types de parcours pour les arbres:
o le parcours en profondeur,
o le parcours en largeur

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 15

LE PARCOURS D’ARBRES BINAIRES


3. Le parcours en profondeur
Explore un arbre branche après branche. On ne passe à la branche suivante qu’une foi tous les
nœuds de la branche courante sont visités.
Il existe trois type, qui reposent essentiellement sur la définition récursive d’un arbre binaire:
Le parcours préfixe: il s’agit de parcourir la racine d’abord, ensuite explorer le sous-arbre
gauche, et finalement le sous-arbre droit
Le parcours infixe(symétrique): ou en ordre, explore le sous-arbre gauche, visiter la racine,
et enfin explorer le sous-arbre droit
Le parcours postefix ou suffixe: ou post-ordre: explorer le sous-arbre gauche, explorer le
sous-arbre droit et visiter la racine

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 16


21/04/2019

LE PARCOURS D’ARBRES BINAIRES


3. Le parcours en largeur
 Explore les nœuds de l’arbre niveau après niveau, l’exploration se fait dans l’ordre suivant:
o le nœud racine
oLe nœud du niveau1
oLes nœud du niveau2, …etc
 Pour ce type de parcours, on ne peut pas appliquer le récursivité, car l’arbre n’obéit plus à une
définition récursive, mais il est considéré comme étant formé de niveaux, chaque niveau contenant un
certain nombre de nœuds.

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 17

LE PARCOURS D’ARBRES BINAIRES


4. Exemple: Parcours d’une expression arithmétique

Soit l’arbre A représentant l’expression arithmétique a!+(b-c)/d


+
 le parcours préfixe de A donne la liste des éléments suivant:
 + ! a / - b c d  notation préfixée e l’expression ! /

Le parcours postfixe de A donne la liste: a - d


 a ! b c - d/+  notation postfixée de l’expression b c
Le parcours infixe donne la liste:
 a ! + b – c / d  notation infixée sans parenthèses
Le parcours en largeur donne la liste:
 +!/a-dbc
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 18
21/04/2019

LE PARCOURS EN PROFONDEUR
Pour parcourir des arbres en profondeur nous allons implémenter des modules
récursives.
Ces modules permettant de:
 Visiter la racine
 parcourir récursivement le sous-arbre gauche
 parcourir récursivement le sous-arbre droit
(selon type de parcours appliquée)

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 19

LE PARCOURS EN PROFONDEUR
1. Parcours infixe
Soit l’arbre A=(r,A1,A2) où r est la racine, A1 est SAG et A2 SAD
Parcours infixe:
 on parcourt de manière infixe le sous arbre gauche (SAG) Remarque:
 on traite la racine Visiter est un module qui
 on parcourt de manière infixe le sous arbre gauche (SAG) effectue le traitement
nécessaire sur l’élément racine
 P.infixe(A)= P.infixe(A1), traiter(r ) , P.infixe(A2)
de l’arbre, il peut s’agir
Procédure infixe (A : ArbreBinaire) d’un affichage par
Début exemple
Si (NON ArbreVide(A)) alors
infixe(FilsGauche(A))
Visiter( Racine(A))
infixe (FilsDroit (A))
Finsi
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 20
Fin
21/04/2019

LE PARCOURS EN PROFONDEUR
2. Parcours préfixe
Soit l’arbre A=(r,A1,A2) où r est la racine, A1 est SAG et A2 SAD
Parcours préfixe:
 on traite la racine
 on parcourt de manière prefixe le sous arbre gauche (SAG) Procédure prefixe (A : ArbreBinaire)
 on parcourt de manière prefixe le sous arbre gauche (SAG) Début
Si (NON ArbreVide(A)) alors
 P.prefixe(A)= traiter(r ) , P. prefixe(A1), P. prefixe(A2)
Visiter( Racine(A))
prefixe(FilsGauche(A))
prefixe (FilsDroit (A))
Finsi
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 21

LE PARCOURS EN PROFONDEUR
3. Parcours prostfixe
Soit l’arbre A=(r,A1,A2) où r est la racine, A1 est SAG et A2 SAD
Parcours postfixe:
 on parcourt de manière postfixe le sous arbre gauche (SAG)
 on parcourt de manière postfixe le sous arbre gauche (SAG) Procédure prefixe (A : ArbreBinaire)
 on traite la racine Début
Si (NON ArbreVide(A)) alors
 P. postfixe(A)= P. postfixe(A1), P. postfixe(A2), traiter(r )
postfixe(FilsGauche(A))
postfixe (FilsDroit (A))
visiter( Racine(A))
Finsi
Fin

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 22


21/04/2019

LE PARCOURS EN LARGEUR
Le parcours dans ce cas ne peut pas être récursif.
Désormais l’arbre n’est plus:
o soit vide
o soit un nœud racine muni d’un sous-arbre gauche et sous-arbre droit
Mais:
o un nœud racine situé au premier niveau
o une succession de nœuds par niveau
Il faut parcourir ces nœuds en ordre, du haut vers bas et de la gauche vers la droit.
Il faut utiliser une autre structure de données, que nous appellerons F.
Il faut sauvegarder les nœuds visités, en faisant en sorte que les nœuds d’un même niveau soient
successifs dans la structure F c-à-d que le frère (ou cousin) d’un nœud doit précéder ses enfants dans F.

21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 23

LE PARCOURS EN LARGEUR 5
2

6
3

Exemple: 9 8

• le nœud 3 doit être celui qui succède à 2dans F et non pas 5 et 6


• le nœud 7 doit succède à 5 et 6.
• chaque nœud de A visité doit être inséré à la fin F, ensuite, on considère le premier nœud sauvegardé dans F, et s’il
a des fils, alors ces derniers sont insérés à la fin de F.
Le premier nœud de A qui est inséré dans F sera 1, ensuite il sera traité, et comme il a pour fils 2 et 3, il seront
insérés à sa suite. Alors F=(1,2,3)
Une fois le nœud 1est traité il faut l’éliminer de la structure de sauvegarde F. Nous obtenons(2,3)
Le 2 est traité, ses fils sont ajoutés à F, et 2 est retiré de F : F =(3,5,6) ele.traite(1,2)
Le 3 est traité et ses enfants ajoutés: F =(5,6,7) ele.traite(1,2,3)
 le parcours de toute la structure F est poursuivi jusqu’à ce qu’elle se vide de tous ses éléments.
Remarque: comme l’ajout dans F se font à la fin, et que les traitement et retraits se font au
début, il es clair que la structure F ne peut être qu’une file.
21/04/2019 EMNA KRAIEM BEN AFIA -------------- L2 INFOS 24

Vous aimerez peut-être aussi