La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

11 février 2014 Cours d'algorithmique 3 - Intranet 1 Cours dAlgorithmique Arbres. Parcours darbres.

Présentations similaires


Présentation au sujet: "11 février 2014 Cours d'algorithmique 3 - Intranet 1 Cours dAlgorithmique Arbres. Parcours darbres."— Transcription de la présentation:

1 11 février 2014 Cours d'algorithmique 3 - Intranet 1 Cours dAlgorithmique Arbres. Parcours darbres.

2 11 février 2014Cours d'algorithmique 3 - Intranet2 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.

3 11 février 2014Cours d'algorithmique 3 - Intranet3 Les arbres valués racine Les feuilles sont les extrémités de larbre. Du point de vue de larbre, elles sont atomiques (sans successeur). Concernant lapplication, elles comportent souvent des valeurs. 5 13

4 11 février 2014Cours d'algorithmique 3 - Intranet4 Il y a des nœuds (internes) qui ont des « fils » en nombre variable. Chaque fils est à son tour un arbre. Concernantlapplication, les nœuds peuventcomporter des valeurs, que lon appelle aussi des étiquettes. Les arbres valués racine x +

5 11 février 2014Cours d'algorithmique 3 - Intranet5 Des sous-arbres racine Sous-arbres !

6 11 février 2014Cours d'algorithmique 3 - Intranet6 L E S A R B R E S S O U S F O R M E D E A. D. T.

7 11 février 2014Cours d'algorithmique 3 - Intranet7 Un arbre est Un arbre est soit, simplement une feuille : soit, simplement une feuille : racine racine soit, un nœud (racine) avec un ou plusieurs fils qui sont des arbres (enracinés) à leur tour : soit, un nœud (racine) avec un ou plusieurs fils qui sont des arbres (enracinés) à leur tour : racine racine arbre arbre arbre arbre arbre arbre Définition des arbres comme ADT

8 11 février 2014Cours d'algorithmique 3 - Intranet8 Les arbres enracinés binaires comme ADT Création dune feuille : Création dune feuille : cree_feuille : void -> A cree_feuille : void -> A cree_feuille : int -> A cree_feuille : int -> A pour créer une feuille qui comporte une valeur entière,pour créer une feuille qui comporte une valeur entière, ainsi que valeur_feuille : A -> intainsi que valeur_feuille : A -> int Création dun nœud binaire : Création dun nœud binaire : cree_arbre : A x A -> A cree_arbre : A x A -> A cree_arbre : A x int x A -> A cree_arbre : A x int x A -> A pour créer un nœud qui comporte une étiquette entière,pour créer un nœud qui comporte une étiquette entière, ainsi que : etiquette_arbre : A -> intainsi que : etiquette_arbre : A -> int

9 11 février 2014Cours d'algorithmique 3 - Intranet9 Les arbres enracinés binaires comme ADT Distinction entre feuilles et noeuds : Distinction entre feuilles et noeuds : est_feuille : A -> BOOL est_feuille : A -> BOOL est_feuille( cree_feuille( ) ) = Vrai est_feuille( cree_feuille( ) ) = Vrai est_feuille( cree_noeud( x, y ) ) = Faux est_feuille( cree_noeud( x, y ) ) = Faux Décomposition dun nœud binaire : Décomposition dun nœud binaire : fils_gauche : A -> A fils_gauche : A -> A fils_droit : A -> A fils_droit : A -> A fils_gauche ( cree_arbre ( g, d ) ) = g fils_gauche ( cree_arbre ( g, d ) ) = g fils_droit ( cree_arbre ( g, d ) ) = d fils_droit ( cree_arbre ( g, d ) ) = d

10 11 février 2014Cours d'algorithmique 3 - Intranet10 arbre_un = cree_arbre ( cree_feuille(5), cree_feuille(7) ); arbre_deux = cree_arbre ( cree_feuille(2), cree_arbre ( arbre_un, cree_arbre ( arbre_un, cree_feuille(1) ) ); cree_feuille(1) ) ); arbre_trois = cree_arbre ( cree_feuille(3), cree_feuille(7) ); arbre = cree_arbre ( arbre_deux, arbre_trois ); Exemple darbres enracinés binaires

11 11 février 2014Cours d'algorithmique 3 - Intranet11 L E S A R B R E S E N L A N G A G E C

12 11 février 2014Cours d'algorithmique 3 - Intranet12 Les arbres en langage C Un pointeur sur un arbre est : Un pointeur sur un arbre est : soit, un pointeur sur une feuille, soit, un pointeur sur une feuille, soit, un pointeur sur un nœud. soit, un pointeur sur un nœud. Il faut donc une structure capable de contenir les deux : Il faut donc une structure capable de contenir les deux : les champs dune feuille, les champs dune feuille, les champs dun nœud, les champs dun nœud, un indicateur booléen qui distingue les deux cas de figure. un indicateur booléen qui distingue les deux cas de figure. Les expressions arithmétiques comme exemple : Les expressions arithmétiques comme exemple : toute feuille est un entier, toute feuille est un entier, chaque nœud comporte un opérateur et deux sous-expressions. chaque nœud comporte un opérateur et deux sous-expressions.

13 11 février 2014Cours d'algorithmique 3 - Intranet13 Les arbres en langage C typedef struct moi_meme {int est_feuille; {int est_feuille; int valeur; int valeur; char etiq; char etiq; struct moi_meme *fg; struct moi_meme *fg; struct moi_meme *fd; struct moi_meme *fd; } t_arbre, *t_ptr_arbre;

14 11 février 2014Cours d'algorithmique 3 - Intranet14 Les arbres en langage C int est_feuille (t_ptr_arbre arbre) {return( arbre->est_feuille ); {return( arbre->est_feuille ); } t_ptr_arbre cree_feuille (int val) {t_ptr_arbre arbre; {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 1; arbre->est_feuille = 1; arbre->valeur = val; arbre->valeur = val; return( arbre ); return( arbre ); }

15 11 février 2014Cours d'algorithmique 3 - Intranet15 Les arbres en langage C t_ptr_arbre cree_noeud (t_ptr_arbre fg, t_ptr_arbre fd, char sym) char sym) {t_ptr_arbre arbre; {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 0; arbre->est_feuille = 0; arbre->etiq = sym; arbre->etiq = sym; arbre->fg = fg; arbre->fg = fg; arbre->fd = fd; arbre->fd = fd; return( arbre ); return( arbre ); }

16 11 février 2014Cours d'algorithmique 3 - Intranet16 Les arbres en langage C t_ptr_arbre fils_gauche (t_ptr_arbre arbre) {assert( !est_feuille( arbre ) ); {assert( !est_feuille( arbre ) ); return( arbre->fg ); return( arbre->fg ); } t_ptr_arbre fils_droit (t_ptr_arbre arbre) {assert( !est_feuille( arbre ) ); {assert( !est_feuille( arbre ) ); return( arbre->fd ); return( arbre->fd ); }

17 11 février 2014Cours d'algorithmique 3 - Intranet17 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

18 11 février 2014Cours d'algorithmique 3 - Intranet18 Listes, arbres et le pointeur NULL Une liste peut être vide ! Une liste peut être vide ! Elle sera représentée par le pointeur NULL ! Elle sera représentée par le pointeur NULL ! La raison profonde est le fait que lopération de base est La raison profonde est le fait que lopération de base est la concaténation, la concaténation, qui est associative qui est associative et possède la liste vide comme élément neutre ! et possède la liste vide comme élément neutre ! Nous avons les fonctions suivantes : Nous avons les fonctions suivantes : cree_vide, est_vide, cree_vide, est_vide, ajout_liste, tete_liste, queue_liste,... ajout_liste, tete_liste, queue_liste,...

19 11 février 2014Cours d'algorithmique 3 - Intranet19 Listes, arbres et le pointeur NULL Un arbre nest jamais NULL ! Un arbre nest jamais NULL ! La raison profonde est le fait que lopération de base est La raison profonde est le fait que lopération de base est la construction darbre la construction darbre qui nest pas associative qui nest pas associative et la question de lélément neutre ne se pose même pas ! et la question de lélément neutre ne se pose même pas ! Arbre ( A, Arbre ( B, C ) ) = Arbre ( Arbre ( A, B ), C ) / A BC C AB

20 11 février 2014Cours d'algorithmique 3 - Intranet20 Listes, arbres et le pointeur NULL Un arbre nest jamais NULL ! Un arbre nest jamais NULL ! La raison profonde est le fait que lopération de base est La raison profonde est le fait que lopération de base est la construction darbre la construction darbre qui nest pas associative qui nest pas associative et la question de lélément neutre ne se pose même pas ! et la question de lélément neutre ne se pose même pas ! Nous avons les fonctions suivantes : Nous avons les fonctions suivantes : cree_feuille, cree_noeud, cree_feuille, cree_noeud, est_feuille, est_feuille, fils_gauche et fils_droit. fils_gauche et fils_droit.

21 11 février 2014Cours d'algorithmique 3 - Intranet21 P A R C O U R S D A R B R E S

22 11 février 2014Cours d'algorithmique 3 - Intranet22 Fibonnacci et les arbres t_ptr_arbre arbre_fibo (int n) {if ( n == 0 ) return( cree_feuille( 0 ) ); return( cree_feuille( 0 ) ); else else if ( n == 1 ) if ( n == 1 ) return( cree_feuille( 1 ) ); return( cree_feuille( 1 ) ); else else return( cree_noeud( arbre_fibo( n-1 ), return( cree_noeud( arbre_fibo( n-1 ), arbre_fibo( n-2 ) ) ) ; } arbre_fibo( n-2 ) ) ) ; }

23 11 février 2014Cours d'algorithmique 3 - Intranet23 Fibonnacci et les arbres Nous observons aussi que de nombreux calculs sont répétés ! arbre_fibo( 5 ) arbre_fibo( 5 )

24 11 février 2014Cours d'algorithmique 3 - Intranet24 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

25 11 février 2014Cours d'algorithmique 3 - Intranet25 Calcul de la somme des feuilles int somme_arbre_fibo (t_ptr_arbre arbre) {if ( est_feuille(arbre) ) return( valeur_feuille( arbre ) ); return( valeur_feuille( arbre ) ); else else return( somme_arbre_fibo( fils_gauche( arbre ) ) return( somme_arbre_fibo( fils_gauche( arbre ) ) + somme_arbre_fibo( fils_droit( arbre ) ) ) ; } + somme_arbre_fibo( fils_droit( arbre ) ) ) ; } Pour tout entier naturel n : fibonnacci( n ) = somme_arbre_fibo o arbre_fibo ( n )

26 11 février 2014Cours d'algorithmique 3 - Intranet26 Calcul de la somme des feuilles sommme_arbre_fibo( 5 ) = 5

27 11 février 2014Cours d'algorithmique 3 - Intranet27 Calcul de la somme des feuilles 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 ) ); return( accumule + valeur_feuille( arbre ) ); else else return( somme_acc( fils_droit( arbre ), return( somme_acc( fils_droit( arbre ), somme_acc( fils_gauche( arbre ), somme_acc( fils_gauche( arbre ), accumule ) ) ) ; } accumule ) ) ) ; } Nous rajoutons un paramètredaccumulation initialisé à 0 ! La valeur de la feuille est ajoutée à laccumulateur ! Laccumulateur ainsi enrichi est ensuite passé à la fonction qui explore le fils droit pour y rajouter les valeurs !

28 11 février 2014Cours d'algorithmique 3 - Intranet28 Calcul de la somme des feuilles somme_arbre_fibo( 5 ) 1 accumule = accumule = 5 = 5 Tout se passe comme si les feuilles étaient rangées dans un tableau ou une liste !

29 11 février 2014Cours d'algorithmique 3 - Intranet29 L E 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

30 11 février 2014Cours d'algorithmique 3 - Intranet30 Parcours en profondeur et préfixe ! res_fg = appel ( fg(a) ); res_fd = appel ( fd(a) ); return(... res_fg... res_fd... ); Types de parcours

31 11 février 2014Cours d'algorithmique 3 - Intranet31 L E 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

32 11 février 2014Cours d'algorithmique 3 - Intranet32 Parcours en profondeur et suffixe ( postfixe ) ! res_fd = appel ( fd(a) ); res_fg = appel ( fg(a) ); return(... res_fg... res_fd... ); Types de parcours Nous parcourons dabord le fils droit et ensuite le fils gauche !

33 11 février 2014Cours d'algorithmique 3 - Intranet33 L E P A R C O U R S E N P R O F O N D E U R

34 11 février 2014Cours d'algorithmique 3 - Intranet34 Parcours avec un opérateur commutatif : Lordre de parcours est sans importance !... oper_commute ( fg(a), fd(a) ) oper_commute ( fd(a), fg(a) )... Types de parcours

35 11 février 2014Cours d'algorithmique 3 - Intranet35 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

36 11 février 2014Cours d'algorithmique 3 - Intranet36 Traitement de létiquette, soit avant, soit après, soit pendant ! * Types de parcours avec étiquettes Impression préfixe de larbre : Impression préfixe de larbre : *

37 11 février 2014Cours d'algorithmique 3 - Intranet37 Traitement de létiquette, soit avant, soit après, soit pendant ! * Types de parcours avec étiquettes Impression préfixe de larbre : Impression préfixe de larbre : * Impression postfixe de larbre : Impression postfixe de larbre : *

38 11 février 2014Cours d'algorithmique 3 - Intranet38 Traitement de létiquette, soit avant, soit après, soit pendant ! * Types de parcours avec étiquettes Impression préfixe de larbre : Impression préfixe de larbre : * Impression postfixe de larbre : Impression postfixe de larbre : * Impression infixe parenthésée : Impression infixe parenthésée : ( ( ) * 3 ) () )(

39 11 février 2014Cours d'algorithmique 3 - Intranet39 L E P A R C O U R S E N L A R G E U R

40 11 février 2014Cours d'algorithmique 3 - Intranet40 Le parcours en largeur se fait à laide dune 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 ! Types de parcours d c..b.... File : b - c - d - e - f ef Nous retirons la tête de file et insérons ses fils en fin de file !

41 11 février 2014Cours d'algorithmique 3 - Intranet41 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

42 11 février 2014Cours d'algorithmique 3 - Intranet42 Parcours en profondeur se fait à laide dune pile ! cree_pile_vide(); empile( racine ); while ( ! pile_vide() ) { traiter = top(); { traiter = top(); depile(); depile(); if ( est_feuille( traiter ) ) if ( est_feuille( traiter ) ) traite( traiter ); traite( traiter ); else else {empile( fils_droit( traiter ) ); {empile( fils_droit( traiter ) ); empile( fils_gauche( traiter ) ); empile( fils_gauche( traiter ) ); } Types de parcours Nous empilons la seule racine ! Tantquil reste des traitements à faire... Une feuille est traitée de suite ! Nous empilons les deux fils dun nœud interne pour traitement !

43 11 février 2014Cours d'algorithmique 3 - Intranet43 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

44 11 février 2014Cours d'algorithmique 3 - Intranet44 Parcours en largeur se fait à laide dune file ! cree_file_vide(); enfile( racine ); while ( ! file_vide() ) { traiter = tete(); { traiter = tete(); defile(); defile(); if ( est_feuille( traiter ) ) if ( est_feuille( traiter ) ) traite( traiter ); traite( traiter ); else else {enfile( fils_droit( traiter ) ); {enfile( fils_droit( traiter ) ); enfile( fils_gauche( traiter ) ); enfile( fils_gauche( traiter ) ); } Types de parcours Les seules différences ! Cest un parcours en largeur suffixe !

45 11 février 2014Cours d'algorithmique 3 - Intranet45 M O D I F I C A T I O N D U N A R B R E

46 11 février 2014Cours d'algorithmique 3 - Intranet46 En reconstruisant : En reconstruisant : Partie qui doit être reconstruite. cree_noeud( fg(arbre), cree_noeud( fg(fd(arbre)), cree_noeud( fg(fd(arbre)), cree_noeud( cree_noeud(cree_feuille(4), cree_noeud( cree_noeud(cree_feuille(4), cree_feuille(6)), cree_feuille(6)), fd(fd(fd(arbre))) ) ) ) ; fd(fd(fd(arbre))) ) ) ) ; Modification dun arbre

47 11 février 2014Cours d'algorithmique 3 - Intranet47 En modifiant : En modifiant : Le pointeur qui est modifié ! modifie_fg_noeud( fd(fd(arbre)), cree_noeud( cree_feuille(4), cree_noeud( cree_feuille(4), cree_feuille(6) ) ) ; cree_feuille(6) ) ) ; Modification dun arbre

48 11 février 2014Cours d'algorithmique 3 - Intranet48 Attention aux partages de structure avec modifications physiques ! 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 ); 3 Représentations physiques ! Modification dun arbre modifie_fd_noeud( fg(arbre_part), 7 ) ; modifie_fd_noeud( fg(arbre_copie), 7 ) ;


Télécharger ppt "11 février 2014 Cours d'algorithmique 3 - Intranet 1 Cours dAlgorithmique Arbres. Parcours darbres."

Présentations similaires


Annonces Google