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
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
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
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
Présentation générale Des sous-arbres ----------------------------------------------------------------- racine Sous-arbres ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 : * + 1 5 3 * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
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 : * + 1 5 3 Impression postfixe de l’arbre : 1 5 + 3 * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
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 : * + 1 5 3 Impression postfixe de l’arbre : 1 5 + 3 * Impression infixe parenthésée : ( ( 1 + 5 ) * 3 ) ( ) * ( + ) 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique
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
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
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
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
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
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
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
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
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
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