Les structures de données. Rajae El Ouazzani

Documents pareils
Les arbres binaires de recherche

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Algorithmique, Structures de données et langage C

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

INF601 : Algorithme et Structure de données

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Arbres binaires de recherche

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

ARBRES BINAIRES DE RECHERCHE

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Quelques Algorithmes simples

Compression de Données - Algorithme de Huffman Document de Conception

Initiation. àl algorithmique et à la programmation. en C

Cours d initiation à la programmation en C++ Johann Cuenin

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Conventions d écriture et outils de mise au point

Représentation d un entier en base b

chapitre 4 Nombres de Catalan


MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Java Licence Professionnelle CISII,

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Algorithmique et Programmation, IMA

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Chapitre 1 : La gestion dynamique de la mémoire

TD3: tableaux avancées, première classe et chaînes

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Algorithmique et Programmation

Programmation Classique en langage C

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Bases de programmation. Cours 5. Structurer les données

INITIATION A LA PROGRAMMATION

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

Chap III : Les tableaux

Cours Programmation Système

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Cours d Algorithmique et de Langage C v 3.0

Solutions du chapitre 4

Les structures. Chapitre 3

Initiation à l algorithmique

Programmation en langage C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours de Systèmes d Exploitation

Le langage C. Séance n 4

Introduction à MATLAB R

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

SUPPORT DE COURS. Langage C

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

3IS - Système d'exploitation linux - Programmation système

Domain Name Service (DNS)

UE C avancé cours 1: introduction et révisions

Cours 6 : Tubes anonymes et nommés

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

TP3 : Manipulation et implantation de systèmes de fichiers 1

Claude Delannoy. 3 e édition C++

Introduction au langage C

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Architecture des ordinateurs

Les algorithmes de base du graphisme

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Pensez à vous inscrire... si ce n est pas encore fait

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Le prototype de la fonction main()

PROJET ALGORITHMIQUE ET PROGRAMMATION II

LE PROBLEME DU PLUS COURT CHEMIN

Cours de C. Allocation dynamique. Sébastien Paumier

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Analyse de sécurité de logiciels système par typage statique

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Rappels Entrées -Sorties

Fondements de l informatique Logique, modèles, et calculs

Travaux Dirigés n 1 : chaînes de caractères

Système de Gestion de Fichiers

Algorithmes d'apprentissage

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

COMPARAISONDESLANGAGESC, C++, JAVA ET

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

TP2 : tableaux dynamiques et listes chaînées

Introduction à la programmation concurrente

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation C. J.-F. Lalande. 15 novembre 2012

V- Manipulations de nombres en binaire

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours de Master Recherche

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Université de Strasbourg UFR de Mathématique et d'informatique. L2 Informatique Semestres S3 et S4. Structures de Données et Algorithmes 1 et 2

Transcription:

Les structures de données Rajae El Ouazzani

Les arbres 2

1- Définition de l arborescence Une arborescence est une collection de nœuds reliés entre eux par des arcs. La collection peut être vide, cad l arborescence ne possède ni nœuds ni arcs. Si l arborescence n est pas vide, elle contient un nœud particulier r appelé racine et une séquence de (sous-) arborescences A 1 ;A 2 ; ;A k, de racines respectives r 1 ; r 2 ; ; r k. La racine r est reliée aux r i avec i є {1,,k, par des arcs orientés directs ou indirects de r vers r i 3

2- Vocabulaire et propriétés L arborescence a une racine a et trois sous-arborescences de racines b, c et d. Les arcs sont implicitement orientés du haut vers le bas. Les fils du nœud g sont les nœuds j, k l, m et n. Le père du nœud j est le nœud g. Les feuilles de cette arborescence sont les nœuds h, i, f, c, j, o, p, q, l, m, n. Les ancêtres de k sont k, g, d et a. Les descendants de b sont b, e, f, h et i. Les hauteurs respectives des nœuds b, c, d sont 2, 0, 3. La hauteur de l arborescence est 4. 4

Les r i sont les fils de r et r est le père de tous les r i. La racine de l arborescence est le seul nœud sans père. Les nœuds qui n ont pas de fils sont appelés feuilles de l arborescence. Les nœuds qui ont au moins un fils sont appelés nœuds internes. Tous les arcs sont orientés de la racine vers les feuilles. Une séquence de nœuds partant d un nœud 'a' en suivant l orientation des arcs jusqu au nœud 'p' s appelle un chemin de a à p. Tous les nœuds du chemin de a à p sont des ancêtres de p et des descendants de a. On peut donc dire que les nœuds d une sous-arborescence de racine x sont les descendants de x (y compris x). 5

La longueur d un chemin a 1 ;a 2 ; ;a k est le nombre d arcs sur le chemin, cad k-1. Il existe exactement un seul chemin de la racine à chaque nœud de l arborescence. La hauteur d un nœud est la longueur du plus long chemin partant de ce nœud et aboutissant à une feuille. La hauteur de toute feuille est donc 0. La hauteur de l arborescence est la hauteur de sa racine. L arité d un nœud est le nombre de ses fils. Une arborescence binaire, ou simplement arbre binaire, est une arborescence dans laquelle tout nœud possède au plus deux fils. 6

Un arbre binaire complet est un arbre binaire dont tous les nœuds internes ont deux fils, et dont tous les chemins de la racine aux feuilles sont de longueur égales. FIG: A gauche, un arbre binaire complet, il est donc parfaitement équilibré. À droite, un arbre binaire possédant le même nombre de nœuds, mais complètement déséquilibré. 7

3- Usages des arborescences Ils sont multiples et ils capturent l idée d hiérarchie. Exemples : découpage d un livre en parties, chapitres, sections, paragraphes, hiérarchies de fichiers, expressions arithmétiques, etc. 8

Déclaration d un nœud La déclaration d un nœud de l arbre est la suivante: typedef struct ABR{ int valeur ; struct ABR* gauche ; struct ABR* droite ; struct ABR* père; //optionnel ABR; Le pointeur vers le nœud père est optionnel. Il sert simplement à simplifier l écriture et la complexité de certains algorithmes. 9

Création et initialisation d un arbre //Création et initialisation d un arbre ABR* creer_arbre ( int n){ /* allocation de la mémoire pour un nœud, il a une valeur, un fils gauche et un fils droit */ ABR* arbre = (ABR* ) malloc ( sizeof (ABR) ) ; arbre->valeur = n ; arbre->gauche = NULL; arbre->droite = NULL; return arbre ; n est la valeur du nœud. 10

4- Parcours d arborescences 2 types de parcours : Parcours en profondeur et parcours en largeur. 4.1. Parcours en profondeur Le parcours en profondeur consiste à explorer un arbre de haut en bas puis de gauche à droite. On distingue trois types de parcours en profondeur : le parcours préfixe traite le nœud courant puis le sous-arbre gauche et enfin le sous-arbre droit ; le parcours infixe traite le sous-arbre gauche, puis le nœud courant et enfin le sous-arbre droit ; le parcours postfixe traite le sous-arbre gauche, le sous-arbre droit et enfin le nœud courant. 11

Exemple : affichage d un arbre Les 3 versions du parcours en profondeur récursif. Parcours préfixe : Le traitement effectué sur les nœuds par les fonctions suivantes est l affichage du contenu du nœud. Dans ce premier parcours préfixe, le traitement du nœud courant est effectué avant les deux appels récursifs. void affiche_prefixe (ABR* arbre ){ printf ( ",%d, ", arbre->valeur ) ; if ( arbre->gauche!= NULL) affiche_prefixe ( arbre->gauche ) ; if ( arbre->droite!= NULL) affiche_prefixe ( arbre->droite) ; 12

Parcours infixe void affiche_infixe (ABR* arbre ){ if ( arbre->gauche!= NULL) affiche_infixe ( arbre->gauche ) ; printf ( ",%d, ", arbre->valeur ) ; if ( arbre->droite!= NULL) affiche_infixe ( arbre->droite) ; Parcours postfixe void affiche_postfixe (ABR* arbre ){ if ( arbre->gauche!= NULL) affiche_postfixe ( arbre->gauche ) ; if ( arbre->droite!= NULL) affiche_postfixe ( arbre->droite) ; printf ( ",%d, ", arbre->valeur ) ; 13

Exemple 1. Parcours préfixe : r,a,c,h,d, i, j,l,b,e,k, f. 2. Parcours postfixe : h,c, i,l, j,d,a,k,e, f,b, r. 3. Parcours infixe : c,h,a, i,d,l, j, r,k,e,b, f. 14

Exercice Écrire les sommets de l arbre ci-dessous pour chacun des ordres: postfixe, préfixe, infixe : Pour le parcours infixe, on ajoute la convention suivante : on ajoute une parenthèse ouvrante à chaque fois qu on rentre dans un sous-arbre et on ajoute une parenthèse fermante lorsqu on quitte ce sous-arbre. 15

4.2. Parcours en largeur Le parcours en largeur d abord consiste à explorer un arbre de gauche à droite puis de haut en bas. 16

Les arbres binaires de recherche 17

Définition d un arbre binaire de recherche Un arbre binaire de recherche est une arborescence binaire représentée sous forme chaînée : chaque nœud de l arbre contient : une valeur, deux champs droit et gauche, pointeurs vers les deux fils du nœud, un champ père, pointeur vers le père du nœud. Lorsque les sous-arbres droit ou gauche sont vides, les champs correspondants valent NULL. Le nœud racine est le seul pour lequel le champ père est NULL. 18

L ABR possède de plus une propriété fondamentale, en appliquant un ordre particuliers sur les valeurs des nœuds fils. Soit x un nœud quelconque d un ABR. Pour tout nœud y du sous-arbre gauche de x, la valeur de y est inférieure ou égale à la valeur de x, et pour tout nœud z du sous-arbre droit de x, la valeur de z est supérieure ou égale à la valeur de x. 19

La figure suivante représente deux exemples d ABR. Elle montre que plusieurs ABR peuvent posséder la même collection de valeurs. Les deux arbres (a) et (b) ont des hauteurs différentes. 20

L insertion d un élément dans un ABR On cherche de façon récursive l emplacement de la valeur: La valeur ne figure pas dans l arbre on l ajoute. La valeur y est déjà, on affiche le message: «Valeur déjà existante». ABR* ajouter_entier ( int n, ABR* arbre ){ ABR* nouveau = creer_arbre (n ) ; return ajout_rec ( nouveau, arbre, arbre ) ; 21

ABR* ajout_rec(abr* nouveau, ABR* arbre, ABR* noeud ){ if ( arbre == NULL){ return nouveau ; if ( nouveau->valeur == noeud->valeur ){ printf("\n Valeur déjà existante\n"); return arbre; else if ( nouveau->valeur <noeud->valeur ){ if ( noeud->gauche == NULL){ noeud->gauche = nouveau ; else { ajout_rec( nouveau, arbre, noeud->gauche ) ; 22

else { //nouveau->valeur >noeud->valeur if ( noeud->droite == NULL){ noeud->droite = nouveau ; else { ajout_rec( nouveau, arbre, noeud->droite) ; return arbre ; 23

La recherche d une valeur dans un ABR A- Fonction itérative de recherche dans un ABR /* La fonction itérative permet de rechercher n dans un arbre dont la racine est pointée par arbre et renvoie un pointeur sur le nœud qui contient n ou NULL si n n est pas dans l arbre */ ABR* rechercher_noeud_iter ( int n, ABR* arbre ){ while (arbre!=null){ if ( arbre->valeur == n) return arbre ; else if (n < arbre->valeur ) arbre=arbre->gauche ; else arbre=arbre->droite ; return NULL; 24

B- Fonction de recherche récursive ABR* rechercher_noeud_rec ( int n, ABR* arbre ){ if ( arbre->valeur == n) return arbre ; else if (n < arbre->valeur ){ if ( arbre->gauche!= NULL) return rechercher_noeud_rec (n, arbre->gauche ) ; else return NULL; else { if ( arbre->droite!= NULL) return rechercher_noeud_rec (n, arbre->droite ) ; else return NULL; 25