Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Département d’informatique
Filière : Licence Académique
Module : Algorithmique et structure de données
Année universitaire : 2015-2016
Introduction :
La structure d'arbre est très utilisée en informatique. d’une part parce que les informations sont
souvent hiérarchisées, et peuvent être représentées naturellement sous une forme arborescente, et
d’autre part, parce que les structures de données arborescentes permettent de stocker des données
volumineuses de façon que leur accès soit efficace.
Sur le fond on peut considérer un arbre comme une généralisation d'une liste car les listes peuvent
être représentées par des arbres. La complexité des algorithmes d'insertion de suppression ou de
recherche est généralement plus faible que dans le cas des listes.
Définition :
Un arbre est une structure de données (souvent dynamique) représentant un ensemble de valeurs
organisées hiérarchiquement. Chaque valeur est stockée dans un nœud. Les nœuds sont connectés
entre eux par des relations parent/fils.
A part le nœud racine, tous les autres nœuds ont exactement un seul nœud parent et zéro ou
plusieurs nœuds fils.
Le nœud racine n'a pas de parent et possède zéro ou plusieurs fils.
Les nœuds qui n'ont pas de fils sont appelés feuilles (ou nœuds externes), les autres (ceux qui ont au
moins un fils) sont appelés nœuds internes.
1
(y/2−t)×(75+z)
Arbres généalogiques. Un arbre généalogique (descendant dans le cas pré sent) repré sente la descendance
d’ une personne ou d’ un couple. Les nœuds de l’ arbre sont ´é tiqueté s par les membres de la famille et
leurs
conjoints. L’ arborescence est construite `a partir des liens de parent´e (les
enfants du couple).
2
Arbre lexicographique. Un arbre lexicographique, ou arbre en parties communes, ou dictionnaire, repré sente
un ensemble de mots. Les pré fixes communs `a plusieurs mots apparaissent une seule fois dans l’ arbre, ce
qui se traduit par un gain d’ espace mé moire. De plus la recherche d’ un mot est assez efficace, puisqu’ il
suffit de parcourir une branche de l’ arbre en partant de la racine, en cherchant a chaque niveau parmi les
fils du noeud courant la lettre du mot de rang correspondant.
Etiquette : Un arbre dont tous les nœuds sont nommés est dit étiqueté. L'étiquette (ou nom du
sommet) représente la "valeur" du nœud ou bien l'information associée au nœud.
Un arbre étiqueté par A,B,…, N
3
Les fils d’un nœud sont les racines de ses sous-arbres; sur l’exemple, les fils de A sont B, C, D et E;
Le père d’un nœud x autre que la racine est l’unique nœud dont x est un fils;
Sur l’exemple, C est le père de G et H ; la racine d’un arbre n’a pas de père ;
Un nœud interne est un nœud qui a au moins un fils; sur l’exemple, D est un nœud interne;
Figure 1
une feuille d’un arbre est un nœud sans fils; sur l’exemple, F, L, H, I, J , M et N sont des feuilles;
Les ancêtres d’un nœud a sont les nœuds qui sont sur le chemin entre la racine (incluse) et a
(inclus) ; les ancêtres de a différents de a sont les ancêtres propres de a; sur l’exemple, les
ancêtres de K sont K, E et A ;
les descendants d’un nœud a sont les nœuds qui appartiennent au sous-arbre de racine a ; les
descendants de a différents de a sont les descendants propres de a ; sur l’exemple, les descendants
de E sont E, J, K , M et N.
Les frères d'un nœud A sont les nœuds qui possèdent le même père que A ; sur l’exemple, G et H
sont frères.
Remarquons que lorsqu'un arbre a tous ses nœuds de degré 1, on le nomme arbre dégénéré et que
c'est en fait une liste.
Hauteur, profondeur ou niveau d'un noeud
Nous conviendrons de définir la hauteur(ou profondeur ou niveau ) d'un noeud X comme égale
au nombre de noeuds à partir de la racine pour aller jusqu'au noeud X.
4
Figure 2
En notant h la fonction hauteur d'un nœud :
Pour atteindre le nœud étiqueté 9 , il faut parcourir le lien 1--5, puis 5--8, puis enfin 8--9 soient 4
nœuds donc 9 est de profondeur ou de hauteur égale à 4, soit h(9) = 4.
Pour atteindre le nœud étiqueté 7 , il faut parcourir le lien 1--4, et enfin 4--7, donc 7 est de
profondeur ou de hauteur égale à 3, soit h(7) = 3.
Si un nœud est à une profondeur p, tous ses successeurs sont à une profondeur p+1.
Tous les nœuds d'un arbre de même profondeur sont au même niveau.
En reprenant l'arbre de la figure 1 : h(M) = 4 et h(G) = 3.
Remarquons que la hauteur h d'un nœud X est égale au nombre de nœuds dans le chemin :
h( X ) = NbrNoeud( Chemin( X ) ).
5
Par définition c'est le nombre de nœuds du chemin le plus long dans l'arbre. La hauteur h d'un
arbre correspond donc au nombre de niveau maximum :
2. Indentation :
3. Ensemble imbriqué
4. Listes parenthesées :
6
Prefixé: A ( B( F ) , C ( G( L ) , H) , D( I ) , E( J, K( M, N ) ) )
Postfixé : ( ( F )B , ( ( L )G , H )C , ( I )D , ( J , ( M , N )K )E )A
Implémentation :
Quand le nombre de fils de chaque élément est variable, on peut soit prévoir un tableau statique des
adresses des fils, soit prévoir un tableau dynamique, ce qui optimise l'occupation mémoire mais
complique l'ajout de fils supplémentaires. Pour avoir une gestion parfaitement dynamique, on peut
créer une liste des adresses des fils :
En fait, plutôt que de créer cette liste hors des nœuds, le plus simple (et qui utilise autant de
mémoire) est d'associer à chaque nœud l'adresse de son fils aîné, et de son frère cadet. Accéder à
tous les fils revient donc à accéder au fils aîné puis à tous ses frères:
Code : C
Arbres binaires
Un arbre binaire est un arbre où chaque nœud est connecté à deux sous-arbres (un sous-arbre
gauche (SAG) et un sous-arbre droit (SAD) ). Ainsi le premier fils d'un nœud A est appelé fils-
gauche (SAG) et le deuxième fils est appelé fils-droit (SAD).
7
Un arbre binaire est dit « strictement binaire » si chaque nœud interne a exactement 2 fils
différents de NULL.
Dans un arbre strictement binaire, le nombre de feuilles est toujours égal au nombre de nœuds
internes + 1. Dans l'exemple précédent, il y a 4 feuilles (E, A, L et H) et 3 nœuds internes (D, F et
J).
Un arbre binaire est dit « complet » (ou complètement équilibré), s'il est strictement binaire et si
toutes les feuilles se trouvent au même niveau :
Ainsi on peut établir une équation entre la profondeur (d) d'un arbre binaire complet et le nombre
total de nœuds (n) : d = log2(n+1)
Un arbre binaire est dit parfait si, en appelant h la hauteur de l’arbre, les niveaux de profondeur 0,
1, …, h – 1 sont complètement remplis alors que le niveau de profondeur h est rempli en partant de
la gauche ; la structure d’un arbre binaire parfait est complètement déterminée par son nombre de
nœuds ; nous donnons ci-après les arbres binaires parfaits à 5 nœuds et à 12 nœuds. On rencontre
aussi quelque fois le qualificatif de presque-complet pour un tel arbre.
8
Un arbre binaire est dit équilibré si, pour tout nœud de l’arbre, les sous-arbres gauche et droit ont
des hauteurs qui diffèrent au plus de 1. L’arbre ci-dessous est équilibré.
Opérations de base
Pré-conditions
a. Racine( ar ) ==> non ArbreVide( ar )
b. SAG( Ar ) ==> non ArbreVide( ar )
c. SAG( Ar ) ==> non ArbreVide( ar )
Post-conditions
a. ArbreVide(Créer_Arbre( ar )) = true
b. ArbreVide(Construire (e, ar1, ar2 )) = false
c. racine(Construire (e, ar1, ar2 )) = e
d. SAG(Construire (e, ar1, ar2 )) = ar1
e. SAD(Construire (e, ar1, ar2 )) = ar2
9
f. Construire(Racine(Ar), SAG(Ar),SAD(Ar)) = Ar
C’est sans doute le meilleur exemple d’algorithme récursif que l’on puisse trouver. Partant du
problème « parcourir l’arbre Ar = ( i , ( Ar1 , … Arn ) ) », on obtient :
Un point reste à régler, qui dépend de l’application particulière considérée : dans quel ordre doit-on
faire les (n + 1) opérations mentionnées ci-dessus ?
Dans le cas des arbres binaires les trois manières possibles d’arranger ce parcours sont fréquemment
utilisées et ont fait l’objet de dénominations spécifiques : le parcours en pré-ordre, le parcours en
in-ordre et le parcours en post-ordre, définis respectivement par le fait que chaque nœud est traité
avant, entre ou après les parcours de ses deux fils.
Dans ce mode de parcours, le nœud courant est traité avant le traitement des nœuds gauche et droit.
Dans ce mode de parcours, le nœud courant est traité entre le traitement des nœuds gauche et droit.
11
parcours postfixe ou suffixé (post-ordre): ( Gauche, Droite, Racine )
Dans ce mode de parcours, le nœud courant est traité après le traitement des nœuds gauche et droit.
Exercices :
1. une fonction qui calcule le nombre de nœuds dans un arbre binaire.
2. une fonction qui fait la somme des valeurs contenues dans un arbre.
3. une fonction qui calcule le nombre de feuilles dans un arbre binaire.
4. une fonction qui calcule la hauteur d’un arbre.
5. tester si un arbre est équilibré
Application :
Représentation des expressions arithmétiques
12
Les expressions arithmétiques peuvent êtres représentées sous forme d'arbre binaire. Les nœuds
internes contiennent des opérateurs, alors que les feuilles contiennent des valeurs (opérandes).
Exercice :
a. Donner une fonction récursive pour évaluer une expression arithmétique sous la forme d'un arbre
binaire.
b. Une autre pour imprimer l’expression infixée parenthèsée.
13
Tas
Un tas, en anglais heap, (ou plus précisément un tas binaire) est une structure de données répondant
aux conditions suivantes :
• c'est un arbre binaire parfait
• 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, et :
Pour tous A et B nœuds de l'arbre tels que B soit un fils de A clé(A) ≥ clé(B)
Cette propriété implique que la plus grande clé soit située à la racine du tas. Ils sont ainsi très
utilisés pour implémenter les files à priorités car ils permettent des insertions en temps
logarithmique et un accès direct au plus grand élément. L'efficacité des opérations effectuée sur des
tas est très importante dans de nombreux algorithmes sur les graphes.
Le fait qu'un tas soit un arbre binaire parfait permet de le représenter d'une manière intuitive par un
tableau unidimensionnel.
le cas du tas est l'un des rares où un vecteur dont le premier élément a l'indice 1 pourrait être
avantageux.
Un arbre binaire parfait a une représentation compacte sans trous dans le tableau:
14
Les deux opérations à définir sur un tas sont :
Pour insérer un nouveau nœud, rien de plus simple, il suffit de l'ajouter tout en bas de l'arbre et de le
faire remonter à sa place, c'est-à-dire à l'échanger avec son père tant que le poids de celui-ci (le
père) est supérieur à son propre poids (le nouveau nœud). Cette opération porte généralement le joli
nom de percolation. Au pire, on remonte le nouveau nœud jusqu'à la racine, donc l'algorithme
correspondant tourne en O(ln n).
15
L'extraction paraît d'une simplicité déconcertante : il suffit d'extraire la racine du tas et le tour est
joué. Le problème, c'est que le tas obtenu est tout sauf un tas, puisqu'il n'a même plus de racine...
Une bonne solution est d'extraire la racine, de placer le dernier nœud du tas à sa place, et de faire
descendre ce dernier jusqu'à sa place dans le tas. Sur l'exemple, ceci donne :
Soit la fonction descente (tamiser) qui permet de descendre ce une clé nœud (position q) jusqu'à sa
place dans le tas.
16
Construction d’un tas :
Interpréter le tableau comme un tas (incorrect) puis rétablir l’ordre en partant des feuilles (vues
comme des tas corrects).
Comme dans le tri fusion on part des tas préexistant (d’abord les feuilles)
Et on construit ensuite l’arbre dont la racine est le père de ces feuilles… etc…
Exemple :
17