Télécharger la présentation
1
Cours d’Algorithmique
Présentation générale Cours d’Algorithmique Arbres. Parcours d’arbres. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
2
Présentation générale
Les arbres enracinés racine Il y a un nœud qui est la racine . Il y a une orientation de la racine vers les autres. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
3
Présentation générale
Les arbres valués racine Les feuilles sont les extrémités de l’arbre. Du point de vue de l’arbre, elles sont atomiques (sans successeur). Concernant l’application, elles comportent souvent des valeurs. 5 13 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
4
Présentation générale
Les arbres valués racine Il y a des nœuds (internes) qui ont des « fils » en nombre variable. Chaque fils est à son tour un arbre. Concernant l’application, les nœuds peuvent comporter des valeurs, que l’on appelle aussi des étiquettes. + x 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
5
Présentation générale
Des sous-arbres racine Sous-arbres ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
6
Présentation générale
L E S A R B R E S S O U S F O R M E D E A . D . T . 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
7
Présentation générale
Définition des arbres comme ADT Un arbre est soit, simplement une feuille : racine soit, un nœud (racine) avec un ou plusieurs fils qui sont des arbres (enracinés) à leur tour : arbre arbre arbre Les arbres sont des structures définies récursivement ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
8
Présentation générale
Les arbres enracinés binaires comme ADT Création d’une feuille : cree_feuille : void -> A cree_feuille : int -> A pour créer une feuille qui comporte une valeur entière, ainsi que valeur_feuille : A -> int Création d’un nœud binaire : cree_arbre : A x A -> A cree_arbre : A x int x A -> A pour créer un nœud qui comporte une étiquette entière, ainsi que : etiquette_arbre : A -> int 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
9
Présentation générale
Les arbres enracinés binaires comme ADT Distinction entre feuilles et noeuds : est_feuille : A -> BOOL est_feuille( cree_feuille( ) ) = Vrai est_feuille( cree_noeud( x , y ) ) = Faux Décomposition d’un nœud binaire : fils_gauche : A -> A fils_droit : A -> A fils_gauche ( cree_arbre ( g , d ) ) = g fils_droit ( cree_arbre ( g , d ) ) = d 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
10
Présentation générale
Exemple d’arbres enracinés binaires arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) ); arbre_deux = cree_arbre ( cree_feuille(2) , cree_arbre ( arbre_un , cree_feuille(1) ) ); arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) ); arbre = cree_arbre ( arbre_deux , arbre_trois ); 2 3 7 5 7 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
11
Présentation générale
L E S A R B R E S E N L A N G A G E C 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
12
Présentation générale
Les arbres en langage C Un pointeur sur un arbre est : soit, un pointeur sur une feuille, soit, un pointeur sur un nœud. Il faut donc une structure capable de contenir les deux : les champs d’une feuille, les champs d’un nœud, un indicateur booléen qui distingue les deux cas de figure. Les expressions arithmétiques comme exemple : toute feuille est un entier, chaque nœud comporte un opérateur et deux sous-expressions. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
13
Présentation générale
Les arbres en langage C typedef struct moi_meme {int est_feuille; int valeur; char etiq; struct moi_meme *fg; struct moi_meme *fd; } t_arbre, *t_ptr_arbre; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
14
Présentation générale
Les arbres en langage C int est_feuille (t_ptr_arbre arbre) {return( arbre->est_feuille ); } t_ptr_arbre cree_feuille (int val) {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 1; arbre->valeur = val; return( arbre ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
15
Présentation générale
Les arbres en langage C t_ptr_arbre cree_noeud (t_ptr_arbre fg, t_ptr_arbre fd, char sym) {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 0; arbre->etiq = sym; arbre->fg = fg; arbre->fd = fd; return( arbre ); } 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
16
Présentation générale
Les arbres en langage C t_ptr_arbre fils_gauche (t_ptr_arbre arbre) {assert( !est_feuille( arbre ) ); return( arbre->fg ); } t_ptr_arbre fils_droit (t_ptr_arbre arbre) return( arbre->fd ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
17
Présentation générale
L I S T E S A R B R E S E T L E P O I N T E U R N U L L 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
18
Présentation générale
Listes, arbres et le pointeur NULL Une liste peut être vide ! Elle sera représentée par le pointeur NULL ! La raison profonde est le fait que l’opération de base est la concaténation, qui est associative et possède la liste vide comme élément neutre ! Nous avons les fonctions suivantes : cree_vide , est_vide , ajout_liste , tete_liste , queue_liste , ... 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
19
Présentation générale
Listes, arbres et le pointeur NULL Un arbre n’est jamais NULL ! La raison profonde est le fait que l’opération de base est la construction d’arbre qui n’est pas associative et la question de l’élément neutre ne se pose même pas ! Arbre ( A , Arbre ( B , C ) ) = Arbre ( Arbre ( A , B ) , C ) / Ce n'est pas associatif. A C B C A B 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
20
Présentation générale
Listes, arbres et le pointeur NULL Un arbre n’est jamais NULL ! La raison profonde est le fait que l’opération de base est la construction d’arbre qui n’est pas associative et la question de l’élément neutre ne se pose même pas ! Nous avons les fonctions suivantes : cree_feuille , cree_noeud , est_feuille , fils_gauche et fils_droit . Il n'y a ni cree_arbre_vide, ni est_arbre_vide ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
21
Présentation générale
P A R C O U R S D ‘ A R B R E S 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
22
Présentation générale
Fibonnacci et les arbres t_ptr_arbre arbre_fibo (int n) {if ( n == 0 ) return( cree_feuille( 0 ) ); else if ( n == 1 ) return( cree_feuille( 1 ) ); return( cree_noeud( arbre_fibo( n-1 ), arbre_fibo( n-2 ) ) ) ; } 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
23
Présentation générale
Fibonnacci et les arbres Nous observons aussi que de nombreux calculs sont répétés ! arbre_fibo( 5 ) 5 4 3 1 3 2 2 1 1 1 2 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
24
Présentation générale
L A S O M M E D E S F E U I L L E S D E L ’ A R B R E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
25
Présentation générale
Calcul de la somme des feuilles int somme_arbre_fibo (t_ptr_arbre arbre) {if ( est_feuille(arbre) ) return( valeur_feuille( arbre ) ); else return( somme_arbre_fibo( fils_gauche( arbre ) ) + somme_arbre_fibo( fils_droit( arbre ) ) ) ; } Pour tout entier naturel n : fibonnacci( n ) = somme_arbre_fibo o arbre_fibo ( n ) 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
26
Présentation générale
Calcul de la somme des feuilles sommme_arbre_fibo( 5 ) = 5 5 5 3 4 3 2 1 2 3 1 2 1 2 1 1 1 1 2 1 1 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
27
Présentation générale
Calcul de la somme des feuilles Nous rajoutons un paramètre d’accumulation initialisé à 0 ! int somme_arbre_fibo (ptr_arbre arbre) {return( somme_acc( arbre , 0 ) ) ; } int somme_acc(ptr_arbre arbre , int accumule) {if ( est_feuille( arbre ) ) return( accumule + valeur_feuille( arbre ) ); else return( somme_acc( fils_droit( arbre ) , somme_acc( fils_gauche( arbre ) , accumule ) ) ) ; } La valeur de la feuille est ajoutée à l’accumulateur ! L’accumulateur ainsi enrichi est ensuite passé à la fonction qui explore le fils droit pour y rajouter les valeurs ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
28
Présentation générale
Calcul de la somme des feuilles somme_arbre_fibo( 5 ) = 5 accumule = 5 5 accumule = 0 4 3 1 3 2 2 1 1 1 2 1 2 Tout se passe comme si les feuilles étaient rangées dans un tableau ou une liste ! 1 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
29
Présentation générale
P A R C O U R S E N P R O F O N D E U R P R E F I X E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
30
Présentation générale
Types de parcours Parcours en profondeur et préfixe ! res_fg = appel ( fg(a) ); res_fd = appel ( fd(a) ); return( ... res_fg ... res_fd ... ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
31
Présentation générale
P A R C O U R S E N P R O F O N D E U R S U F F I X E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
32
Présentation générale
Types de parcours Parcours en profondeur et suffixe ( postfixe ) ! Nous parcourons d’abord le fils droit et ensuite le fils gauche ! res_fd = appel ( fd(a) ); res_fg = appel ( fg(a) ); return( ... res_fg ... res_fd ... ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
33
Présentation générale
P A R C O U R S E N P R O F O N D E U R 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
34
Présentation générale
Types de parcours Parcours avec un opérateur commutatif : L’ordre de parcours est sans importance ! ... oper_commute ( fg(a) , fd(a) ) ... ... oper_commute ( fd(a) , fg(a) ) ... La distinction entre gauche et droite est inutile ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
35
Présentation générale
L E P A R C O U R S E N P R O F O N D E U R A V E C E T I Q U E T T E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
36
Présentation générale
Types de parcours avec étiquettes Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
37
Présentation générale
Types de parcours avec étiquettes Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * Impression postfixe de l’arbre : * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
38
Présentation générale
Types de parcours avec étiquettes Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * Impression postfixe de l’arbre : * Impression infixe parenthésée : ( ( ) * 3 ) ( ) * ( + ) 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
39
Présentation générale
P A R C O U R S E N L A R G E U R 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
40
Présentation générale
Types de parcours Le parcours en largeur se fait à l’aide d’une file : Le nœud à traiter est au début de la file ! Les nouveaux nœuds à traiter sont insérés en fin de file ! .. .. .. b c d e f Nous retirons la tête de file et insérons ses fils en fin de file ! File : b - c - d - e - f 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
41
Présentation générale
L E P A R C O U R S E N P R O F O N D E U R E N P S E U D O - C O D E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
42
Présentation générale
Nous utiliserons une récursion Types de parcours Parcours en profondeur se fait à l’aide d’une pile ! Nous empilons la seule racine ! cree_pile_vide(); empile( racine ); while ( ! pile_vide() ) { traiter = top(); depile(); if ( est_feuille( traiter ) ) traite( traiter ); else {empile( fils_droit( traiter ) ); empile( fils_gauche( traiter ) ); } Tantqu’il reste des traitements à faire ... Une feuille est traitée de suite ! Nous empilons les deux fils d’un nœud interne pour traitement ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
43
Présentation générale
L E P A R C O U R S E N L A R G E U R E N P S E U D O - C O D E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
44
Présentation générale
Types de parcours Ce sera à nous de l'écrire Parcours en largeur se fait à l’aide d’une file ! Les seules différences ! cree_file_vide(); enfile( racine ); while ( ! file_vide() ) { traiter = tete(); defile(); if ( est_feuille( traiter ) ) traite( traiter ); else {enfile( fils_droit( traiter ) ); enfile( fils_gauche( traiter ) ); } C’est un parcours en largeur suffixe ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
45
Présentation générale
M O D I F I C A T I O N D ’ U N A R B R E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
46
Présentation générale
Modification d’un arbre En reconstruisant : Partie qui doit être reconstruite. 3 5 7 2 4 6 cree_noeud( fg(arbre) , cree_noeud( fg(fd(arbre)) , cree_noeud( cree_noeud(cree_feuille(4) , cree_feuille(6)) , fd(fd(fd(arbre))) ) ) ) ; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
47
Présentation générale
Modification d’un arbre En modifiant : Le pointeur qui est modifié ! 3 5 7 2 4 6 modifie_fg_noeud( fd(fd(arbre)) , cree_noeud( cree_feuille(4) , cree_feuille(6) ) ) ; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
48
Présentation générale
Modification d’un arbre Attention aux partages de structure avec modifications physiques ! sous_arbre_a = cree_noeud(cree_feuille(3) , cree_feuille(5)); sous_arbre_b = cree_noeud(cree_feuille(3) , cree_feuille(5)); sous_arbre_c = cree_noeud(cree_feuille(3) , cree_feuille(5)); arbre_part = cree_noeud( sous_arbre_a , sous_arbre_a ); arbre_copie = cree_noeud( sous_arbre_b , sous_arbre_c ); modifie_fd_noeud( fg(arbre_part) , 7 ) ; modifie_fd_noeud( fg(arbre_copie) , 7 ) ; Pas pareil ! ! ! Représentations physiques ! 7 7 3 3 3 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.