Structures de Données - Ecole Mohammadia d`ingénieurs

publicité
Les arbres: Définition
Université Mohammed V- Agdal
Ecole Mohammadia d'Ingénieurs
Département Génie Informatique
« Un
U arbre
b estt composé
é d’un
d’ ensemble
bl de
d nœuds,
d
d’un ensemble d’arcs reliant les nœuds, et d’un nœud
particulier appelé racine de l’arbre.
Un arc (n1,n2) établit une relation entre le nœud n1,
appelé nœud parent, et n2, appelé nœud enfant de
Structures de Données
n1. L’ensemble des arcs doit être tel que chaque nœud,
sauf la racine, a exactement un parent »
Exemple:
B
E
La racine (Niveau 0)
A
C
F
niveau 1
D
G
H
I
niveau 2
Par: Mr N.EL FADDOULI
J
K
niveau 3
Année Universitaire:2013/2014
EMI/ Structures de Données / N. El Faddouli
EMI/ Structures de Données / N. El Faddouli
74
1
Les arbres: Caractéristiques
•
Les arbres: Caractéristiques
• On peut fixer un degré maximum pour un arbre pour
Trois types de nœuds:
- Racine: le seul nœud de l’arbre qui n’a pas de parent.
- Feuilles: les nœuds qui n’ont pas d’enfants.
qu'il soit: unaire, binaire, ternaire...
• La hauteur de l’arbre est le plus grand niveau
- Nœuds internes: ni des feuilles ni la racine.
qu’on
qu
on
trouve
parmi
ses
nœuds
(la
profondeur
maximale).
• Chaque nœud possède:
• Si l’ordre entre les sous-arbres enfant est pris en
- un degré: le nombre de ses enfants.
- un niveau (profondeur): nombre d’arcs qu’il faut
remonter pour atteindre la racine.
compte, on parlera d’arbre ordonné.
• Les opérations sur les arbres:
- Ajouter un élément.
qu’on
on
• A chaque nœud est aussi associé un élément qu
- Déterminer si un élément existe dans l’arbre.
appelle contenu du nœud ou valeur du nœud
- Supprimer un élément de l’arbre.
• Le degré (l’arité) de l’arbre est le plus grand degré
- …
• Dans ce qui suit, on traitera les arbres binaires
qu’on trouve.
(degré=2). C'est le type le plus basique dont toutes les
opérations sont valables pour un arbre n-aire.
EMI/ Structures de Données / N. El Faddouli
75
EMI/ Structures de Données / N. El Faddouli
76
2
Les arbres binaires
Les arbres binaires
Définition TAD:
Définition:
Type arbre:
Un arbre binaire T est:
o Soit un arbre vide
o Soit un triplet (r,g,d) où:
 r est la valeur de la racine de l'arbre
 g est un sous
sous-arbre
arbre gauche
 d est un sous-arbre droite.
 les deux sous-arbres peuvent être vides.
Utilise élément, booléen , entier
Opérations:
Exemple:
A
g
d
C
B
estvide
t id
: arbre
b
 booléen
b lé
arbrevide
:
 arbre
racine
: arbre
 élément
arbregauche : arbre
 arbre
arbredroit
: arbre
 arbre
hauteur
: arbre
 entier
existeelement: arbre, élément  booléen
D
F
E
….
G
Fin Type
I
Exercice:
- Définir la fonction existeelement de manière
récursive en fonction de: estvide, racine, arbregauche
et arbredroite.
EMI/ Structures de Données / N. El Faddouli
77
EMI/ Structures de Données / N. El Faddouli
78
3
Les arbes binaires
Les arbres binaires
Implémentation chainée:
Booléen existeelement (arbre A, element e)
Début
T
g


5

d
Fin
Entier Hauteur( arbre A)
Début
typedef struct nœud * arbre;
struct nœud { int val;
struct nœud { int val; arbre g, d; }
struct nœud *g;
struct nœud *d;
d; };
Fin
Entier NbNoeuds( arbre A) .....
Entier NbFeuilles( arbre A) .....
Entier NbFeuillesIn( arbre A) .....
EMI/ Structures de Données / N. El Faddouli
Créer un arbre vide:
79
arbre T = NULL;
EMI/ Structures de Données / N. El Faddouli
80
4
Les arbes binaires
Les arbes binaires
O é ti
Opérations:
O é ti
Opérations:
int EstVide(arbre);
int EstVide(arbre T) {
arbre FilsGauche (arbre);
}
arbre FilsDroit (arbre);
arbre FilsGauche (arbre T) {
int EstFeuille(arbre);
}
int EstNoeudInterne(arbre);
arbre FilsDroit (arbre T) {
int Hauteur(arbre);
}
int NbreNoeud(arbre);
int EstFeuille(arbre T) {
int NbreFeuille(arbre);
}
int nbreNoeudInterne(arbre);
int EstNoeudInterne(arbre T) {
}
EMI/ Structures de Données / N. El Faddouli
81
EMI/ Structures de Données / N. El Faddouli
82
5
Les arbes binaires
Les arbes binaires
Opérations:
P
Parcours
en profondeur:
f d
int Hauteur(arbre T) {
Préfixe, infixe, suffixe
Parcours préfixe:
Pour un arbre T:
}
int NbreNoeud(arbre) {
• On traite la racine de l'arbre T (affichage, …)
• On passe ensuite aux sous-arbres gauche et
droit  C
C'est
est un parcours RGD ou RDG.
RDG
}
Exemple: Affichage préfixe de l'arbre suivant:
5
int NbreFeuille(arbre) {
40
10
}
9
int nbreNoeudInterne(arbre) {
8
2
30
20
}
EMI/ Structures de Données / N. El Faddouli
83
5, 10, ………………………………………………………..
EMI/ Structures de Données / N. El Faddouli
84
6
Les arbes binaires
Les arbes binaires
Parcours infixe:
Parcours préfixe:
Pour un arbre T:
void Parcours_Pref( arbre T)
• On traite le sous-arbre gauche
{
• On traite la racine de ll'arbre
arbre T (affichage,
(affichage …))
• On passe ensuite au sous-arbre droit.
 C'est un parcours GRD
Exemple: Affichage infixe de l'arbre suivant:
5
40
10
}
9
8
2
30
20
…………………………………………………………
EMI/ Structures de Données / N. El Faddouli
85
EMI/ Structures de Données / N. El Faddouli
86
7
Les arbes binaires
Les arbes binaires
Parcours post-fixe:
post fixe:
Parcours infixe:
Pour un arbre T:
void Parcours_Inf( arbre T)
• On traite le sous-arbre gauche
{
• On passe ensuite au sous
sous-arbre
arbre droit.
droit
• On traite la racine de l'arbre T (affichage, …)
 C'est un parcours GDR
Exemple: Affichage postfixe de l'arbre suivant:
5
40
10
}
9
8
2
30
20
…………………………………………………………
EMI/ Structures de Données / N. El Faddouli
87
EMI/ Structures de Données / N. El Faddouli
88
8
Les arbes binaires
Les arbes binaires
Parcours post-fixe:
Création d'un arbre:
void Parcours_Post( arbre T)
• Un arbre vide est un pointeur contenant NULL.
{
• Un arbre non vide est un pointeur sur la racine de
l' b (structure
l'arbre
( t t
contenant
t
t trois
t i champs:
h
valeur
l
d la
de
l
racine, sous-arbre gauche et sous-arbre droit)
• La création d'un arbre se fait à partir d'une racine, un
sous-arbre g
gauche et un sous-arbre droit:
arbre CreerArbre( val_racine, fg, fd)
En langage C: arbre d'entiers
arbre CreerArbre (int v, arbre fg, arbre fd )
{ arbre a=(arbre) malloc( sizeof(*a) ) ;
a -> val = v;
}
a ->g =fg;
Exercice:
- Fonction qui calcule le nombre d'occurrences d'un
return a;
}
entier dans un arbre T.
EMI/ Structures de Données / N. El Faddouli
a ->d = fd;
89
EMI/ Structures de Données / N. El Faddouli
90
9
Les arbes binaires
Les arbes binaires de recherche
Ajouter un élément dans un arbre:
• Les éléments du sous-arbre
sous arbre gauche sont inférieurs
• Ajouter dès que possible (rencontrer un fils vide)
• Ajouter l'élément de façon à garder un ordre entre les
ou égales à la racine.
• Les éléments du sous-arbre droit sont supérieurs à
éléments de l'arbre.
• Ajouter de façon à avoir un arbre complet le plus
possible (un arbre complet = arbre binaire dont les
la racine.
• Optimiser la recherches dans un arbre: parcourir
feuilles ont la même profondeur).
seulement une branche
Ajout à la rencontre d'un fils vide:
 temps de recherche proportionnel à la hauteur de
l'arbre.
void Ajouter( arbre *t, int v)
{
Exemple:
if (*t==NULL) *t = CreerArbre( v, NULL, NULL);
5
else if ( (*t)->g==NULL)
(*t)->g= CreerArbre( v, NULL, NULL);
40
4
else if ( (*t)->d==NULL)
*t) ->d=
>d CreerArbre(
C
A b ( v, NULL,
NULL NULL);
NULL)
4
2
30
50
else Ajouter (&((*t)->g), v) ;
20
}
EMI/ Structures de Données / N. El Faddouli
91
EMI/ Structures de Données / N. El Faddouli
92
10
Les arbes binaires de recherche
Les arbes binaires de recherche
Recherche d'un élément:
Ajouter un élément comme feuille l'arbre:
Booléen Recherche( arbre T,
T entier x)
{
void AjouterElt( arbre *T, int x)
Si Estvide(T) retourner faux
{
Sinon
Si Racine(T) = X retourner vrai
Sinon
Si Racine(T)>=x
retourner Recherche(Filsgauche(T), x)
Sinon
retourner Recherche(Filsdroit(T), x)
}
if ( *T
T ==NULL)
NULL) *T
T = CreerArbre(x,
CreerArbre(x NULL,
NULL NULL);
else if (x > (*T) -> val) AjouterElt(&((*T) ->d), x);
else AjouterElt(&((*T) ->g), x);
}
Exercice: Ecrire un programme principal qui fait appel
à cette fonction. La saisie des éléments de l'arbre se
fera par niveaux (niveau 0, niveau 1, …)
int Recherche( arbre T, int x)
{
Exemple: la saisie des éléments 14, 7, 16, 5, 8, 15, 17,
3, 6 permettra d'avoir l'arbre suivant:
14
16
7
5
3
}
EMI/ Structures de Données / N. El Faddouli
93
8
15
17
6
EMI/ Structures de Données / N. El Faddouli
94
11
Les arbes binaires de recherche
Les arbes binaires de recherche
Insérer un élément:
L'insertion de 13 modifiera la liste comme suit:
void InsererElt( arbre *T, int x)
{
14
16
13
15
7
}
5
Exercice: Modifier le programme principal de ll'exercice
exercice
17
8
3
6
précédent pour faire appel à la fonction InsererElt afin
d'insérer un nouvel élément.
L'insertion de 20 modifiera la liste comme suit:
Exemple: la saisie des éléments 14, 7, 16, 5, 8, 15, 17,
20
3, 6 permettra d'avoir l'arbre suivant:
14
14
16
7
5
3
8
16
13
15
17
5
6
EMI/ Structures de Données / N. El Faddouli
15
7
3
95
17
8
6
EMI/ Structures de Données / N. El Faddouli
96
12
TP
Exercice 1:
1.Définir la structure Nœud et le type Arbre (voir cours)
2.Définir
la
fonction
Arbre CreerArbre (int v, Arbre G, Arbre D) qui crée un
arbre de racine v et ayant les sous-arbres G et D.
qui
3.Ecrire la fonction void InsererElt(( arbre *T,, int X)) q
ajoute un nœud X dans un arbre de recherche T.
4. Ecrire la fonction
void
Parcours_pref(Arbre T) pour
afficher l'arbre T en ordre préfixé
5
5.
Ecrire un programme principal lire les valeurs d
d'un
un arbre
par niveau et les insère dans un arbre initialement vide
et affiche l'arbre créé.
Exemple: la saisie des éléments 14, 7, 16, 5, 8, 15, 17, 3, 6
permettra
tt d'avoir:
d'
i
14
16
7
5
3
8
15
17
6
EMI/ Structures de Données / N. El Faddouli
97
13
Téléchargement