LES ARBRES Un arbre est une structure homogène dont chaque élément,

Slides:



Advertisements
Présentations similaires
ORTHOGRAM PM 3 ou 4 Ecrire: « a » ou « à » Référentiel page 6
Advertisements

GEF 243B Programmation informatique appliquée Listes chaînées I – Tableaux de structures §15.1 – 15.2.
Structures de données avancées : Principales structures de données
Chap. 4 Recherche en Table
Chapitre 3 Les arbres binaires
Licence pro MPCQ : Cours
Distance inter-locuteur
Les numéros
GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2.
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Chap. 1 INTRODUCTION Beaucoup de problèmes de la vie courante, tels la gestion de réseaux de communication ou l'ordonnancement de tâches, correspondent.
Chap. 1 Structures séquentielles : listes linéaires
Chapitre VI. Arbres (définition, parcours, représentation)
Mr: Lamloum Med LES NOMBRES PREMIERS ET COMPOSÉS Mr: Lamloum Med.
Cours 8 Arbres équilibrés
ALGORITHMES RECURSIFS
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Structures de données linéaires
Récursivité.
LOGO Responsable du cours Mlle Amina GHRAB : 1 ère année IAG Institut Supérieur de Gestion de Tunis.
Les structures de données arborescentes
Les algorithmes: complexité et notation asymptotique
IFT-2000: Structures de Données
Cours de physique générale I Ph 11
1 Guide de lenseignant-concepteur Vincent Riff 27 mai 2003.
RECURSIVITE ARBRES BINAIRES
1.2 COMPOSANTES DES VECTEURS
II. Chaînage, SDD séquentielles
Détection de co-évolution de gènes Master 2 : Informatique à Finalité Professionnelle et Recherche Unifiée (IFPRU) Parcours Ingénierie de lIntelligence.
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Bases de données lexicales
Gestion de Fichiers Arbres B.
LES NOMBRES PREMIERS ET COMPOSÉS
Sections sélectionnées du Chapitre 11
Les fichiers indexés (Les B-arbres)
LES ARBRES IUP 2 Génie Informatique
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes
Modèles d’implantation
Structures de données IFT-2000
Représentation des systèmes dynamiques dans l’espace d’état
Représentation des systèmes dynamiques dans l’espace d’état
Représentation des systèmes dynamiques dans l’espace d’état
DUMP GAUCHE INTERFERENCES AVEC BOITIERS IFS D.G. – Le – 1/56.
1 Licence dinformatique Algorithmique des graphes Problèmes dordonnancement. Utilisation de ce document strictement réservée aux étudiants de l IFSIC dans.
Les arbres binaires.
Les arbres et tas binomiaux
Exposé en structures de données
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Semaine 11 Gestion des arbres binaires de tri et de recherche. Les arbres cousus. Les arbres n-aires Département.
Mise en forme en Mathématiques
Structures de données IFT-2000
Structures des données
Le langage C Structures de données
1/65 微距摄影 美丽的微距摄影 Encore une belle leçon de Macrophotographies venant du Soleil Levant Louis.
Ch. PAUL - Piles et Files à l'aide de listes chainées
LES PILES ET FILES.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Notions de pointeurs en C
et quelques rappels sur certains éléments du langage C
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Arbres binaires et tables de hachage
ETNA – 1ème année Guillaume Belmas –
Cours LCS N°4 Présenté par Mr: LALLALI
1 UMLV  FICHIERS Mémoire de masse découpée en blocs Fichier :liste chaînée de blocs, ou arbre de blocs (répertoires - fichiers)‏ Bloc d’éléments Bloc.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Semaine 10 Les algorithmes de recherche Les structures arborescentes Département d’informatique et de génie.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

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 

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.

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.

LES ARBRES

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.

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.

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.

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:

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.

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).

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.

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.

LES ARBRES Représentation d'arbres à l'aide de tableaux

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….

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.

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

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.

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

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;

LES ARBRES Représentation avec allocation dynamique Simulation d ’une adresse mémoire Exemple d'un arbre réalisé par chaînage.

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;

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.

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.

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.

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.

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…)

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.

LES ARBRES BINAIRES ORDONNÉES Exemple Arbres syntaxiques (a+b)*c-d/e Arbre syntaxique d'une expression arithmétique

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 : 00 V : 01 W : 100 X : 1010 Y : 1011 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.

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 =.

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.

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

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); }

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.

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; }

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;

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; }

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);

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 nom,@ 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; }

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):

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); }

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.

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.

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.

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...

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.

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.

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.

LES ARBRES BINAIRES ORDONNÉES La visite arborescente Par niveau : on traite l ’arbre niveau par niveau, de la racine aux feuilles

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

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.

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)); }

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) + 1 + nb_el_a(a2) nb_el_a(a1) + nb_el_a(a2) + 1 Ceci correspond aux différents parcours d'arbres.

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...