Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parAdeline Bellet Modifié depuis plus de 10 années
1
LES ARBRES Un arbre est une structure homogène dont chaque élément,
appelé noeud, contient de l'information et plusieurs liens (pointeurs) vers des éléments du même type. D'une manière plus formelle, on peut dire qu'un arbre de type de base T est : soit la structure vide soit un noeud de type T (racine) auquel est associé un nombre fini de sous-arbres disjoints (descendants). Les arbres sont dits structures récursives non-linéaires
2
LES ARBRES Définitions
Un arbre orienté (appelé parfois arbre enraciné) est un graphe acyclique orienté qui vérifie les conditions suivantes: Il existe exactement un noeud qui n'a pas de ‘ prédécesseur ’. Ce noeud s'appelle la racine et l'ordre d'entrée de la racine est 0. Tous les noeuds, sauf la racine, n'ont qu'un ‘ prédécesseur ’ et ils ont tous un ordre d'entrée égal à 1. Il existe un chemin unique de la racine à chaque noeud.
3
LES ARBRES NOMENCLATURE
Le niveau d'un noeud est le nombre d'arcs qu'il faut parcourir pour arriver à ce noeud. La racine est de niveau 1. La profondeur d'un arbre (ou hauteur) est le nombre maximum d'arcs qu'il faut parcourir pour aller de la racine à une feuille. Les noeuds terminaux (qui n'ont pas de descendants) sont appelés feuilles. Les noeuds non-terminaux sont appelés noeuds intérieurs. Un noeud Y, situé immédiatement sous un noeud X, est appelé le descendant ou fils (direct) de X. Inversement, X est appelé l'ancêtre ou père (direct) de Y.
4
LES ARBRES
5
LES ARBRES Le nombre de sous-arbres associés à un noeud
(nombre de descendants directs) est appelé le degré du noeud. Le degré d'un arbre correspond au degré le plus élevé de ses noeuds. Une chaîne (liste linéaire) est un arbre de degré 1. Le chemin d'un noeud est la suite d'arcs qui mènent de la racine à ce noeud. La longueur du chemin d'un noeud est donc égale à la profondeur de ce noeud. Un arbre est dit équilibré si, à chaque niveau, la profondeur des différents sous-arbres ne varie pas de plus d'un niveau.
6
LES ARBRES Un arbre ordonné est un arbre où la position respective
des sous-arbres reflète une relation d'ordre. Un arbre de degré 2 est appelé arbre binaire. Un arbre de degré supérieur à 2 est appelé arbre multiple.
7
LES ARBRES Ainsi, un arbre binaire est un arbre orienté qui vérifie
les conditions suivantes : Chaque fils d'un noeud est soit fils gauche, soit fils droit. Aucun noeud n'a plus de deux fils. Une forêt est un ensemble d'arbres.
8
LES ARBRES Propriétés Le nombre maximum de noeuds qu'un arbre de
profondeur "p" et de degré "d" peut contenir, si tous les noeuds internes ont "d" descendants, est : à la racine (niveau 1), on a d 0 =1 nœud , au niveau 2, on a d 1 noeuds, au niveau p, on a d p-1 noeuds, En particulier, pour un arbre binaire, on a:
9
LES ARBRES Propriétés La longueur maximale d'un chemin est la hauteur de l'arbre. Pour un arbre binaire avec n noeuds, étant donné que le nombre maximum de feuilles est (n + 1) / 2, la longueur maximale d'un chemin est log2[(n + 1) / 2)]. La recherche d'un noeud dans un arbre est beaucoup plus efficace que la recherche linéaire dans une liste, où le chemin maximal est n.
10
LES ARBRES La représentation des arbres en mémoire
En ce qui concerne la représentation en mémoire des arbres, nous verrons d'abord celle des arbres binaires. Cela peut se faire avec l'allocation statique d'espace (tableaux) ou avec une allocation dynamique (chaînage).
11
LES ARBRES Représentation d'arbres à l'aide de tableaux
Il y a deux techniques que l'on peut utiliser dans ce cas pour simuler un arbre : La première prévoit non seulement l'allocation statique de la mémoire mais aussi l'allocation statique des noeuds de l'arbre dans la matrice.
12
LES ARBRES Représentation d'arbres à l'aide de tableaux
Pour ce faire, on identifie chaque noeud de l'arbre : La racine a comme identificateur 1 Un fils gauche a comme identificateur 2D Un fils droit a comme identificateur 2D + 1 où D est l'identificateur du père.
13
LES ARBRES Représentation d'arbres à l'aide de tableaux
14
LES ARBRES Représentation d'arbres à l'aide de tableaux
les noeuds qui manquent sont signalés par un trou dans le tableau de l'espace perdu! Dans le cas où il n'y a pas beaucoup de trous, ce problème a peu d'importance mais si le nombre de trous est élevé, on peut chercher un moyen de structurer l'arbre autrement….
15
LES ARBRES Représentation d'arbres à l'aide de tableaux
La deuxième technique: on retient encore une matrice mais au lieu de fixer la position de chaque nœud dans la matrice, on attribue les positions au fur et à mesure que les noeuds sont créés. Chaque noeud a besoin de trois champs : un champ pour la donnée même; un champ qui vise le fils gauche; un champ qui vise le fils droit. S'il n'y a pas de fils, ces champs contiendront 0 (ou -1!); autrement, on y mettra l'indice de la position de la matrice qui contient le fils en question.
16
LES ARBRES Illustration Représentation d'arbres à l'aide de tableaux
8 3 11 2 4 10 12 1 6 9 14 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 8 3 11 2 4 10 12 1 6 9 14 élément d’information indice du sous-arbre de gauche indice du sous-arbre de droite 2 4 6 8 10 3 5 7 9 11
17
LES ARBRES Représentation d'arbres à l'aide de tableaux
Cette réalisation comporte deux inconvénients D'abord, les noeuds sont plus grands que ceux de la matrice à positions fixes. Ensuite, il faut contrôler la position des champs libres. Comme la matrice a un nombre fixe d'éléments, on peut en former deux structures : l'arbre même et une liste des noeuds libres.
18
LES ARBRES Arbre binaire complet
indice du premier élément du niveau k? nombre de feuilles? nombre de nœuds internes? nombre de nœuds? hauteur? feuilles à gauche! 1 9 2 3 4 5 6 7 8 9 10 11 12 13 14 15
19
LES ARBRES Représentation d'arbres à l'aide de tableaux
Exemple d’un modèle d’implantation…particulier #define un_type ... #define TAILEMAX ... typedef struct Element { un_type Info; struct Element *Gauche, *Droit; }elem; typedef{ int nb; elem tab [TAILEMAX]; elem * Racine ; } arbre;
20
LES ARBRES Représentation avec allocation dynamique
Simulation d ’une adresse mémoire Exemple d'un arbre réalisé par chaînage.
21
LES ARBRES BINAIRES ORDONNÉES
Parmi les différentes structures d'arbres possibles, une des plus intéressantes à utiliser est la structure d'arbre binaire ordonné (arbre de tri, arbre syntaxique, arbre généalogique...). Exemple d’implantation typedef int Info_type; typedef struct Noeud { InfoType Info; struct Noeud *Gauche,* Droite; }noeud; typedef struct {noeud* racine; } arbre;
22
LES ARBRES Représentation avec allocation dynamique
Lors de la création d'un noeud, on obtient l'espace nécessaire du système d'exploitation, lequel nous fournit en même temps l'adresse du noeud. On remplit le champ donnée de l'information voulue et on met l'adresse du noeud dans le champ du pointeur approprié (gauche ou droit) du père. S'il s'agit d'ajouter une nouvelle feuille, ceci n'est pas compliquée. Mais quand il s'agit d'un noeud à l'intérieur de l'arbre, il faut suivre attentivement l'attribution de la valeur aux pointeurs.
23
LES ARBRES Représentation avec allocation dynamique
Cette structure nous intéresse particulièrement, car les arbres binaires se donnent très bien à l'emmagasinage des informations ordonnées. On a déjà mentionné comment on peut visiter chaque noeud dans un arbre. On va considérer un arbre arrangé de telle façon que le contenu du fils gauche soit plus petit que celui du père et le contenu du fils droit soit plus grand que celui du père. On aura donc un arbre binaire orienté et, ce qui est mieux, un arbre binaire ordonné. Il faut noter que la visite de cet arbre en ordre symétrique fournit une liste ordonnée.
24
LES ARBRES BINAIRES ORDONNÉES
Description en terme de type abstrait le rôle d'une structure d'arbre binaire ordonné est de stocker des informations en conservant, en plus, une hiérarchie entre ces informations. Cette hiérarchie reflète des liens de dépendance entre les données. Il peut y avoir au plus deux types de liens différents (lien gauche et lien droite). la déclaration d'un arbre binaire ordonné doit spécifier le type de bases des éléments qu'il contiendra.
25
LES ARBRES BINAIRES ORDONNÉES
Primitives de manipulation: 1. initialiser un arbre à vide. 2. définir la racine d'un arbre vide. 3. regrouper un élément (racine) et deux sous-arbres (un des sous-arbres peut être vide) 4. ajouter un élément (éventuellement tout un sous-arbre) à gauche (ou à droite) d'un élément ne possédant pas de descendant gauche (ou droit, respectivement). 5. indiquer si l'arbre est vide. 6. indiquer l'absence éventuelle de descendant gauche (ou droit) pour un élément auquel on a accès.
26
LES ARBRES BINAIRES ORDONNÉES
7. accéder à la racine de l'arbre. 8. accéder à la racine du sous-arbre gauche (ou droit) d'un élément auquel on a accès. 9. décomposer un arbre en un élément (ancienne racine) et un ou deux sous-arbres (suivant que la racine avait un ou deux descendants). 10. détruire un (sous-)arbre (l'arbre peut n'être composé que d'un seul élément). 11. remplacer un sous-arbre par un autre sous-arbre. 12. Etc…(voir exercices…)
27
LES ARBRES BINAIRES ORDONNÉES
Exemple: Arbres syntaxiques Un arbre syntaxique est une structure chargée de refléter la précédence existant entre les différents opérateurs et symboles d'un langage dans des expressions Ils sont utilisés pour représenter des expressions algébriques. Dans ce cas, chaque noeud intérieur contient un opérateur et les feuilles contiennent les opérandes.
28
LES ARBRES BINAIRES ORDONNÉES
Exemple Arbres syntaxiques (a+b)*c-d/e Arbre syntaxique d'une expression arithmétique
29
LES ARBRES BINAIRES ORDONNÉES
Le code Huffman affecte à chaque feuille la séquence de bits de la racine à la feuille considérée. Exemple : U : V : 01 W : X : Y : Z : 11 Ce code possède la priorité “ préfixée ”,c'est-à-dire que le code relatif à un item quelconque n'est pas le segment initial d'un quelconque autre item.
30
LES ARBRES BINAIRES ORDONNÉES
Exemple Arbres de tri Un arbre de tri est une structure chargée de refléter une relation d'ordre existant entre différentes informations. Ces informations doivent comporter un champ (clé de tri) sur lequel on puisse appliquer une fonction permettant de savoir si un élément doit être avant ou après un autre. La plupart du temps, ce champ sera de type numérique ou alphabétique sur lequel on pourra utiliser les opérateurs de comparaison:<, > ou =.
31
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Un arbre de tri reflète un séquencement (linéaire) des éléments qu'il contient. Le même ensemble de valeurs peut donc être représenté par différentes configurations d'arbres binaires suivant l'ordre selon lequel les valeurs auront été traitées. Il est possible de mémoriser une liste ordonnée à l'aide d'un arbre binaire.
32
LES ARBRES BINAIRES ORDONNÉES
#define lien struct s_noeud* typedef struct s_noeud { char *nom; lien fils1; lien fils2; }type_noeud; typedef struct { type_noeud * racine }arbre; Arbres de tri Listes triées Implantation
33
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées lien cree_feuille(char* nouv_nom) { lien x; int taille; x = (lien) malloc (sizeof(type_noeud)); taille = strlen(nouv_nom)+1; /* compter le \0 */ x->nom = (char*) malloc (taille); strcpy(x->nom, nouv_nom); x->fils1 = NULL; x->fils2 = NULL; return(x); }
34
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées Si vous créez progressivement l'arbre, vous pourrez voir que toute nouvelle valeur trouve toujours sa place, les feuilles se transformant petit à petit en noeuds, au fur et à mesure de l'augmentation de la taille de l'arbre.
35
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées Quelques opérateurs utiles arbre init_a(void) { arbre R; R.racine= NULL; return R; } arbre cree_racine_a(arbre R, char* nouv_nom) { R.racine= cree_feuille(nouv_nom); return R; }
36
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées, insertion non récursive.. void insert_a(arbre R, char* nouv_nom) { lien x; x= cree_feuille(nouv_nom); while(R.racine != NULL) { if(strcmp(x->nom, R.racine->nom) < 0) if(R.racine->fils1 == NULL) { R.racine->fils1 = x; return; } else R.racine = R.racine->fils1; else if(R.racine->fils2 == NULL) {R.racine->fils2 = x; return; else R.racine = racine->fils2;
37
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées arbre insere_a (char un_nom[], arbre p) { INSERER(un_nom, &p.racine); return p; }
38
void INSERER (char un_nom [ ], lien* racine)
{ if(*racine == NULL) *racine = (lien)malloc(sizeof(type_noeud)); strcpy ((*racine)->nom,un_nom); (*racine)->droite = NULL; (*racine)->gauche = NULL; } else if (strcmp(un_nom,(*racine)->nom) < 0) INSERER (un_nom,&(*racine)->fils1); else INSERER (un_nom,&(*racine)->fils2);
39
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées arbre saisie(void) {arbre R; char txt[100]; R=init_a(); do { printf("entrez un pour finir:"); gets(txt); if(strcmp(txt, if(R.racine == NULL) R= cree_racine_a(R,txt); else insert_a(R,txt); } while(strcmp(txt, return R; }
40
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées On remarque l'efficacité de cette méthode : aucun déplacement d'élément, le tri se fait par insertion, mais avec recherche optimisée. Parcours facile des données sans coût trop important en mémoire (avec deux liens on obtient une structure bidimensionnelle, alors qu'avec une liste à chaînage avant et arrière on garde une structure unidimensionnelle, bien que bidirectionnelle). Une fois l'arbre créé, on peut afficher la liste triée par ordre alphabétique par un simple parcours infixé (arbr_nom):
41
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées void affiche(lien racine) { if(racine != NULL) {affiche(racine->fils1); printf("%s, ", racine->nom); affiche(racine->fils2); }
42
LES ARBRES BINAIRES ORDONNÉES
Arbres de tri Listes triées Par contre l'arbre binaire nécessite d'être équilibré pour profiter pleinement de ces avantages. Un arbre équilibré est un arbre organisé de telle manière à ce que sa profondeur soit minimale. À l'extrême, en cas d'introduction d'une liste de noms déjà triée, tous les fils1 pointeront sur NULL alors que les fils2 pointeront sur le suivant, on se retrouve avec une liste chaînée simple.
43
LES ARBRES BINAIRES ORDONNÉES
Arbres binaires de recherche Un arbre binaire de tri est également dit de recherche. Dans le cas général, la recherche d'un élément dans un arbre binaire de recherche reste linéaire dans le pire des cas et logarithmique en moyenne. On peut rendre cette recherche logarithmique dans le pire des cas en utilisant les arbres équilibrés et leurs variantes.
44
LES ARBRES BINAIRES ORDONNÉES
Arbres équilibrés On dit aussi arbres AVL (du nom de leurs inventeurs Adel'son - Vel'skii Landis en 1962). Un arbre binaire est dit équilibré lorsque la différence entre les hauteurs des fils gauche et droit de tout noeud ne peut excéder 1.
45
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente On parcourt généralement un arbre pour appliquer un traitement à chacun de ses noeuds. On distingue plus particulièrement trois méthodes de parcours d'arbres binaires...
46
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente En pré-ordre : on traite la racine puis le sous-arbre gauche et enfin le sous-arbre droit.
47
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente En ordre : on traite le sous-arbre gauche puis la racine et enfin le sous-arbre droit.
48
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente En post-ordre : on traite le sous-arbre gauche puis le sous-arbre droit et enfin la racine.
49
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente Par niveau : on traite l ’arbre niveau par niveau, de la racine aux feuilles
50
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente Priorité au père : 17, 7, 2, 1, 5, 13, 8, 28, 23, 18, 32, 31, 33 Priorité au fils : 1, 5, 2, 8, 13, 7, 18, 23, 31, 33, 32, 28, 17 Priorité symétrique : 1, 2, 5, 7, 8, 13, 17, 18, 23, 28, 31, 32, 33
51
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente L'impression d'un arbre de tri se fait par un parcours en ordre puisque la valeur stockée dans le noeud racine se situe entre les valeurs du sous-arbre gauche et celles du sous-arbre droit. L'évaluation d'un arbre syntaxique se fait avec un parcours en post-ordre puisqu'il faut évaluer les deux opérandes avant de pouvoir traiter l'opérateur.
52
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente Un autre opérateur.. int nb_el_a(arbre a) { arbre a1, a2; if(a == NULL)return 0; a1.racine=a.racine->fils1; a2.racine=a.racine->fils2; return (1+nb_el_a(a1)+nb_el_a(a2)); }
53
LES ARBRES BINAIRES ORDONNÉES
La visite arborescente On peut remarquer que diverses écritures sont possibles: 1 + nb_el_a(a1) + nb_el_a(a2) nb_el_a(a1) nb_el_a(a2) nb_el_a(a1) + nb_el_a(a2) + 1 Ceci correspond aux différents parcours d'arbres.
54
LES ARBRES BINAIRES ORDONNÉES
Opérations sur les arbres binaires de tri & de recherche Nous reviendrons courant les prochaines séances sur les opérations les plus courantes que l'on effectue sur une structure d'arbre, entre autres: l ’insertion dans un arbre de recherche. la suppression dans un arbre de tri et de recherche. En plus de découvrir les algorithmes d ’équilibration d ’arbres binaires de recherche...
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.