Les arbres binaires – Implémentations
Nathalie Junior Bouquet
mars 2014
Défnition :
Un arbre binaire est soit vide, soit de la forme B= <o,G,D>, où Get Dsont des arbres binaires
disjoints et ’o’ est un nœud appelé racine.
q
e
u
q
no
c
l
e
u
Figure 1 – Arbre binaire
1 Le type algébrique abstrait
sorte
ArbreBinaire
utilise
Nœud, Élément
opérations
arbre-vide :ArbreBinaire
<–, –, –> : Nœud ×ArbreBinaire ×ArbreBinaire ArbreBinaire
racine : ArbreBinaire Nœud
g: ArbreBinaire ArbreBinaire
d: ArbreBinaire ArbreBinaire
contenu : Nœud Élément
préconditions
racine(B)est-défini-ssi B̸=arbre-vide
g(B)est-défini-ssi B̸=arbre-vide
d(B)est-défini-ssi B̸=arbre-vide
axiomes
racine(<o,G,D>) = o
g(<o,G,D>) = G
d(<o,G,D>) = D
avec
G,D: ArbreBinaire
o: Nœud
L’opération contenu permet d’associer à chaque Nœud de l’arbre une information de type Élément.
Un arbre dont les nœuds contiennent des éléments est dit arbre étiqueté.
1
Algorithmique
Les arbres binaires – Implémentations mars 2014
Prépas
Epita
On notera, abusivement, <r,G,D> l’arbre dont la racine contient l’élément r.
D
r
G
Figure 2 – Arbre binaire : une structure récursive
2 Implémentations
2.1 Implémentation dynamique
La représentation la plus naturelle reproduit la structure récursive (voir figure 2).
On utilise les pointeurs pour chaîner entre eux les nœuds. A chaque nœud on associe deux pointeurs,
vers les deux sous-arbres gauche et droit. L’arbre non vide est représenté par un pointeur sur le nœud
racine. Il a la valeur nul s’il est vide.
Nous utiliserons la plupart du temps des arbres étiquetés. Un champ supplémentaire cle représente
l’information contenue dans le nœud.
2.1.1 Le type
types
/* t_element */
t_arbreBinaire = t_noeudBinaire
t_noeudBinaire = enregistrement
t_element cle
t_arbreBinaire fg, fd
fin enregistrement t_noeudBinaire
e
B
NUL
NULNUL
NUL
NUL
NULNULNULNUL
NUL
NUL
uq
c
q e
l
o n
u
Figure 3 – Représentation dynamique de l’arbre de la figure 1
2
Algorithmique
Les arbres binaires – Implémentations mars 2014
Prépas
Epita
2.1.2 Implémentation des opérations
Type abstrait : ArbreBinaire Implémentation : type t_arbreBinaire
B: ArbreBinaire B : t_arbreBinaire
arbre-vide nul
contenu(racine(B)) B.cle
g(B) B.fg
d(B) B.fd
2.2 Implémentation statique : la numérotation hiérarchique
On peut utiliser un simple vecteur pour représenter un arbre binaire. Il suffit de stocker chaque valeur
à la position correspondant au numéro en ordre hiérarchique du nœud la contenant.
10
i
a t
f
r
a
p
_
n
u
1
2 3
4 5 6 7
8 9
Figure 4 – Arbre binaire parfait + numérotation hiérarchique
constantes
MaxN = ...
types
/* t_element*/
t_vect_elts = MaxN t_element
variables
t_vect_elts B
L’arbre de la figure 4 sera représenté par le tableau suivant :
1 2 3 4 5 6 7 8 9 10
f p i n r a t u _ a
L’utilisation de cette représentation est intéressante sur un arbre parfait (ou complet, comme celui de
la figure 8), car on peut limiter la taille du vecteur à celle de l’arbre. Par contre, sur un arbre quelconque,
la place occupée est moins optimale.
Représentation de l’arbre de la figure 1 :
1 2 3 4 5 6 7 8 9 10 11 12 13 . . .
e c u u l q q e o n . . .
3
Algorithmique
Les arbres binaires – Implémentations mars 2014
Prépas
Epita
La place utilisée sera d’autant moins optimisée que la hauteur de l’arbre sera élevée. Un arbre généré
(ou filiforme) à nnœuds nécessitera un vecteur de taille 2n1!
f
e
f
i
l
i
Figure 5 – Arbre filiforme Figure 6 – Peigne droit
Représentation de l’arbre filiforme de la figure 5 :
1 2 3 . . . 7 . . . 14 . . . 29 . . . 58 . . .
f i . . . l . . . i . . . f . . . e . . .
Représentation du peigne droit de la figure 6 :
1 2 3 . . . 6 7 . . . 14 15 . . . 30 31 . . . 62 63 . . .
p d e . . . r i . . . o g . . . i n . . . t e . . .
Utilisation
La racine est en position 1 dans le vecteur.
Si iest la position du nœud actuel alors :
son fils gauche se trouve à la position 2i
son fils droit se trouve à la position 2i+ 1
son père (sauf pour la racine de l’arbre),
se trouve à la position idiv 2.
En pratique, il faut avoir une valeur particulière ()
pour remplacer la racine de l’arbre vide. Sauf si
l’arbre est parfait : la taille de l’arbre suffit !
4
Algorithmique
Les arbres binaires – Implémentations mars 2014
Prépas
Epita
3 Parcours d’un arbre binaire
3.1 Parcours en profondeur
Le parcours en profondeur main gauche consiste à
descendre dans l’arbre à gauche le plus loin possible.
Lorsqu’on ne peut plus descendre, on remonte d’un
niveau : si on vient de la gauche, on descend à droite,
sinon on remonte encore. . . Et on recommence. . .
La manière la plus simple d’envisager ce parcours est récursive. Il revient tout simplement à parcourir
le sous-arbre gauche, puis à parcourir le sous-arbre droit !
DG
r
(1) : préfixe (2) : infixe (3) : suffixe
(3)
(2)
(1)
Figure 7 – Parcours en profondeur d’un arbre binaire
Lors du parcours en profondeur, chaque nœud est rencontré trois fois :
(1) avant de descendre sur le sous arbre-gauche : ordre préfixe,
(2) en remontant de la gauche, avant de descendre à droite : ordre infixe (ou symétrique),
(3) en remontant de la droite : ordre suffixe (ou postfixe).
Exemples : les trois ordres de traitement des nœuds d’un arbre induits lors d’un parcours en profondeur.
L’ordre préfixe sur l’arbre de la figure 8 donnera : lui_est_complet
L’ordre infixe sur l’arbre de la figure 4 donnera : un_parfait
L’ordre suffixe sur l’arbre de la figure 1 donnera : quelconque
m te
l
p
o
c
_te_
i
u
l
s
Figure 8 – Arbre binaire complet
5
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !