Accueil > Forum > > > > Recursivité dans un arbre binaire simplement chaînée
Recursivité dans un arbre binaire simplement chaînée
dimanche 16 mars 2008 à 19:55:06 |
Recursivité dans un arbre binaire simplement chaînée

daviddubois
|
Bonjour, J'ai un code ci-dessous qui permet de trouver le père d'un noeud dans un arbre binaire (simplement chaîné). [CODE] FONCTION AB1_Pere(Racine,NoeudRef); PARAMETRES Racine : POINTEUR DE TNoeudAB1; [I] NoeudRef : POINTEUR DE TNoeudAB1; [I/O] RETOURNER POINTEUR DE TNoeudAB1; VARIABLE NoeudPere : POINTEUR DE TNoeudAB1; DEBUT SI Racine == NULL ALORS RETOURNER NULL; SINON SI (Racine->FG == NoeudRef) OU (Racine->FD == NoeudRef) ALORS RETOURNER Racine; SINON NoeudPere = AB1_Pere(Racine->FG,NoeudRef); SI NoeudPere == NULL ALORS NoeudPere = AB1_Pere(Racine->FD,NoeudRef); FIN SI RETOURNER NoeudPere; FIN SI FIN[/CODE]Je vais décirre ligne par ligne afin d'être le plus clair possible dans mes questions sur cette fonction : [CODE]FONCTION AB1_Pere(Racine,NoeudRef);[/CODE] Une autre fonction appelle AB1_Pere et lui transmet Racine et NoeudRef. Racine est la racine de l'abre (son adresse en tous cas) et NoeudRef est le noeud recherché (on recherche également l'adresse). Les deux paramètres reçus sont de type POINTEUR DE TNoeudAB1; [I] pour la racine et NoeudRef : POINTEUR DE TNoeudAB1; [I/O] pour NoeudRef. Voici la composition de la structure TNoeudAB1 : [CODE]TYPE TNoeudAB1 = STRUCTURE Donnee : DATA; FG,FD : POINTEUR DE TNoeudAB1; FIN STRUCTURE[/CODE]
[CODE]SI Racine == NULL ALORS RETOURNER NULL; SINON SI (Racine->FG == NoeudRef) OU (Racine->FD == NoeudRef) ALORS RETOURNER Racine;[/CODE]Vous l'aurez mieux compris que moi, si la racine est NULL, on renvoie NULL, SINON SI le fils gauche de la racine est égal au noeud recherché ou si l'adresse du fils droit de la racine correspond au noeud recherché, on renvoie alors la racine. Ce qui nous intéresse est ci-dessous : [CODE] SINON NoeudPere = AB1_Pere(Racine->FG,NoeudRef);[/CODE]On affecte à la variable NoeudPere le résultat obtenu par la fonction AB1_Pere en lui passant comme paramtère Racine->FG et NoeudRef. Et s'est ici que je ne comprends pas bien, je pense qu'on part de Racine->FilsGauche car s'est le départ mais après : - comment on voit que l'on passe d'un noeud à l'autre (voir un exemple de récursivité qui montre bien une décrémentation tout en bas de cette page) ? [CODE] SI NoeudPere == NULL ALORS[/CODE] Si NoeudPere est NULL, s'est qu'il n'y a rien [CODE]NoeudPere = AB1_Pere(Racine->FD,NoeudRef);[/CODE] On fait alors la recherche dans la branche droite [CODE] FIN SI RETOURNER NoeudPere; FIN SI FIN[/CODE] On retourne le résultat trouvé (l'adresse de la structure Père). Ce qui "ne me plait pas" s'est que je ne vois pas comment on passe d'un noeud à l'autre. Dans cet exemple, on voit bien comment la récursivité est utilisée : public static long factorielle(int n) { if (n<=0) return 1; else return n*factorielle( n-1); } on peut voir ici que la condition de fin est n est inférieur ou égal à zéro ET n diminue de 1 à chaque fois qu'il appelle sa propre fonction pour ne pas faire une boucle infinie, mais dans mon code ci-dessus, je ne vois pas le changement d'adresse. Merci d'avance pour votre aide. beegees
|
|
dimanche 16 mars 2008 à 22:53:30 |
Re : Recursivité dans un arbre binaire simplement chaînée

jfrancois
|
Pour voir la récursivité en action sur le parcours d'un arbre, il suffit de réaliser un exemple avec des traces :
#include <stdio.h> #include <stdarg.h> // --- Voir un message avec une indentation liée à la récursivité // --- Le niveau est incrémenté quand on entre dans AB1_Pere() // --- Le niveau est décrémenté quand on quitte AB1_Pere() #define CHAINE(p) (p ? p->pData : "NULL") void Voir (int iAction,const char* pText,...) { char szText[100]; va_list pArg; va_start(pArg,pText); vsprintf(szText,pText,pArg); va_end(pArg); static int iNiveau = 0; if (iAction == -1) --iNiveau; printf("%02d ",iNiveau); for (int i=0 ; i<3*iNiveau ; ++i) printf(" "); printf(szText); printf("\n"); if (iAction == +1) ++iNiveau; } struct NOEUD // description d'un noeud { const char* pData; // chaque NOEUD aura son nom comme data NOEUD* pFG; // pointe le fils de gauche NOEUD* pFD; // pointe le fils de droite }; const NOEUD* AB1_Pere(const NOEUD* pRacine,const NOEUD* pNoeudRef) { const NOEUD* pNoeudPere; Voir(+1,"ENTREE AB1_Pere(%s,%s)",CHAINE(pRacine),CHAINE(pNoeudRef)); if (pRacine == NULL) { Voir(-1,"SORTIE AB1_Pere() avec racine NULL"); return NULL; } if (pRacine->pFG == pNoeudRef) { Voir(-1,"SORTIE AB1_Pere() avec noeud %s trouve a gauche",CHAINE(pNoeudRef)); return pRacine; } if (pRacine->pFD == pNoeudRef) { Voir(-1,"SORTIE AB1_Pere() avec noeud %s trouve a droite",CHAINE(pNoeudRef)); return pRacine; } Voir(0,"Appel du sous-arbre gauche avec %s comme racine",CHAINE(pRacine->pFG)); pNoeudPere = AB1_Pere(pRacine->pFG,pNoeudRef); if (pNoeudPere == NULL) { Voir(0,"Appel du sous-arbre droit avec %s comme racine",CHAINE(pRacine->pFD)); pNoeudPere = AB1_Pere(pRacine->pFD,pNoeudRef); } Voir(-1,"SORTIE AB1_Pere() avec noeud pere %s",CHAINE(pNoeudPere)); return pNoeudPere; } void main() { // On va créer cet arbre : // // +-- FD2 --+-- FD3 // | | // +-- FD1 --+ +-- FG3 // | | // | +-- FG2 --+-- FD4 // | | // RAC --+ +-- FG4 // | // | +-- FD5 --+-- FD6 // | | | // +-- FG1 --+ +-- FG6 // | // +-- FG5 --+-- FD7 // | // +-- FG7 NOEUD FD3 = {"FD3",NULL,NULL}; NOEUD FG3 = {"FG3",NULL,NULL}; NOEUD FD2 = {"FD2",&FG3,&FD3}; NOEUD FD4 = {"FD4",NULL,NULL}; NOEUD FG4 = {"FG4",NULL,NULL}; NOEUD FG2 = {"FG2",&FG4,&FD4}; NOEUD FD1 = {"FD1",&FG2,&FD2}; NOEUD FD6 = {"FD6",NULL,NULL}; NOEUD FG6 = {"FG6",NULL,NULL}; NOEUD FD5 = {"FD5",&FG6,&FD6}; NOEUD FD7 = {"FD7",NULL,NULL}; NOEUD FG7 = {"FG7",NULL,NULL}; NOEUD FG5 = {"FG5",&FG7,&FD7}; NOEUD FG1 = {"FG1",&FG5,&FD5}; NOEUD RAC = {"RAC",&FG1,&FD1}; // --- Test 1 printf("\nChercher le noeud pere de FD6 :\n\n"); const NOEUD* pPere = AB1_Pere(&RAC,&FD6); printf("\nLe noeud pere de FD6 est %s\n\n",CHAINE(pPere)); // --- Test 2 printf("\nChercher le noeud pere de FG1 :\n\n"); pPere = AB1_Pere(&RAC,&FG1); printf("\nLe noeud pere de FG1 est %s\n\n",CHAINE(pPere));
// --- Test 3 printf("\nChercher le noeud pere de RAC :\n\n"); pPere = AB1_Pere(&RAC,&FG1); printf("\nLe noeud pere de RAC est %s\n\n",CHAINE(pPere)); } Ce qui donne :
Chercher le noeud pere de FD6 : 00 ENTREE AB1_Pere(RAC,FD6) 01 Appel du sous-arbre gauche avec FG1 comme racine 01 ENTREE AB1_Pere(FG1,FD6) 02 Appel du sous-arbre gauche avec FG5 comme racine 02 ENTREE AB1_Pere(FG5,FD6) 03 Appel du sous-arbre gauche avec FG7 comme racine 03 ENTREE AB1_Pere(FG7,FD6) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,FD6) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,FD6) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 03 Appel du sous-arbre droit avec FD7 comme racine 03 ENTREE AB1_Pere(FD7,FD6) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,FD6) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,FD6) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 02 SORTIE AB1_Pere() avec noeud pere NULL 02 Appel du sous-arbre droit avec FD5 comme racine 02 ENTREE AB1_Pere(FD5,FD6) 02 SORTIE AB1_Pere() avec noeud FD6 trouve a droite 01 SORTIE AB1_Pere() avec noeud pere FD5 00 SORTIE AB1_Pere() avec noeud pere FD5 Le noeud pere de FD6 est FD5 Chercher le noeud pere de FG1 : 00 ENTREE AB1_Pere(RAC,FG1) 00 SORTIE AB1_Pere() avec noeud FG1 trouve a gauche Le noeud pere de FG1 est RAC Chercher le noeud pere de RAC : 00 ENTREE AB1_Pere(RAC,RAC) 01 Appel du sous-arbre gauche avec FG1 comme racine 01 ENTREE AB1_Pere(FG1,RAC) 02 Appel du sous-arbre gauche avec FG5 comme racine 02 ENTREE AB1_Pere(FG5,RAC) 03 Appel du sous-arbre gauche avec FG7 comme racine 03 ENTREE AB1_Pere(FG7,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 03 Appel du sous-arbre droit avec FD7 comme racine 03 ENTREE AB1_Pere(FD7,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 02 SORTIE AB1_Pere() avec noeud pere NULL 02 Appel du sous-arbre droit avec FD5 comme racine 02 ENTREE AB1_Pere(FD5,RAC) 03 Appel du sous-arbre gauche avec FG6 comme racine 03 ENTREE AB1_Pere(FG6,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 03 Appel du sous-arbre droit avec FD6 comme racine 03 ENTREE AB1_Pere(FD6,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 02 SORTIE AB1_Pere() avec noeud pere NULL 01 SORTIE AB1_Pere() avec noeud pere NULL 01 Appel du sous-arbre droit avec FD1 comme racine 01 ENTREE AB1_Pere(FD1,RAC) 02 Appel du sous-arbre gauche avec FG2 comme racine 02 ENTREE AB1_Pere(FG2,RAC) 03 Appel du sous-arbre gauche avec FG4 comme racine 03 ENTREE AB1_Pere(FG4,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 03 Appel du sous-arbre droit avec FD4 comme racine 03 ENTREE AB1_Pere(FD4,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 02 SORTIE AB1_Pere() avec noeud pere NULL 02 Appel du sous-arbre droit avec FD2 comme racine 02 ENTREE AB1_Pere(FD2,RAC) 03 Appel du sous-arbre gauche avec FG3 comme racine 03 ENTREE AB1_Pere(FG3,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 03 Appel du sous-arbre droit avec FD3 comme racine 03 ENTREE AB1_Pere(FD3,RAC) 04 Appel du sous-arbre gauche avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 04 Appel du sous-arbre droit avec NULL comme racine 04 ENTREE AB1_Pere(NULL,RAC) 04 SORTIE AB1_Pere() avec racine NULL 03 SORTIE AB1_Pere() avec noeud pere NULL 02 SORTIE AB1_Pere() avec noeud pere NULL 01 SORTIE AB1_Pere() avec noeud pere NULL 00 SORTIE AB1_Pere() avec noeud pere NULL Le noeud pere de RAC est NULL Jean-François
|
|
lundi 17 mars 2008 à 12:30:55 |
Re : Recursivité dans un arbre binaire simplement chaînée

daviddubois
|
Bonjour jfrancois,
Merci pour ton code qui me semble très intéressant.
Qaund je compile, j'ai ces messages d'erreurs :
rec.cpp C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(43) : error C2660: 'Voir' : function does not take 4 parameters C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(51) : error C2660: 'Voir' : function does not take 3 parameters C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(56) : error C2660: 'Voir' : function does not take 3 parameters C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(59) : error C2660: 'Voir' : function does not take 3 parameters C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(63) : error C2660: 'Voir' : function does not take 3 parameters C:\Documents and Settings\David\Mes documents\Recursivite\recursivite\rec.cpp(66) : error C2660: 'Voir' : function does not take 3 parameters Error executing cl.exe.
Saurais-tu m'aider stp ?
Merci d'avance.
|
|
lundi 17 mars 2008 à 13:30:32 |
Re : Recursivité dans un arbre binaire simplement chaînée

jfrancois
|
Bonjour,
1) La fonction Voir() a un nombre variable d'arguments pour permettre de passer des variables (...) à formater dans le texte (pFormat) via la macro CHAINE() pour éviter les pointeurs NULL. Quand je compile sous mon Visual C++ 6.0, je n'ai aucun problème, c'est vraiment un source basique. En cherchant des infos sur cette erreur C2660 il est proposé d'utiliser l'opérateur de résolution de portée "::" (écrire ::Voir(+1,"ENTREE ...") ) car il se peut qu'il y ait, dans votre environnement, une autre fonction Voir() avec un nombre précis d'arguments ! mais c'est peu probable ! Vous utilisez quel compilateur ? Si votre compilateur n'admet pas l'argument "..." il suffit de formater le texte avant l'appel à la fonction Voir().
2) Dans cette même fonction Voir() on peut remplacer : for (int i=0 ; i<3*iNiveau ; ++i) printf(" "); par for (int i=0 ; i<iNiveau ; ++i) printf("| "); c'est plus joli !
3) J'ai modifié AB1_Pere() pour éviter la longue recherche du 3ème test (recherche de la racine même de l'arbre) et réorganiser un peu le parcours des 2 sous-arbres :
Voici ce que tout cela donne :
#include <stdio.h> #include <stdarg.h> // --- Voir un message avec une indentation liée à la récursivité // --- Le niveau est incrémenté quand on entre dans AB1_Pere() // --- Le niveau est décrémenté quand on quitte AB1_Pere() #define CHAINE(p) (p ? p->pData : "NULL") void Voir(int iAction,const char* pFormat,...) { char szText[100]; va_list pArg; va_start(pArg,pFormat); vsprintf(szText,pFormat,pArg); va_end(pArg); static int iNiveau = 0; if (iAction < 0) --iNiveau; printf("%02d ",iNiveau); for (int i=0 ; i<iNiveau ; ++i) printf("| "); printf(szText); printf("\n"); if (iAction > 0) ++iNiveau; } // --- Description d'un noeud de l'arbre struct NOEUD { const char* pData; // chaque NOEUD aura son nom comme data NOEUD* pFG; // pointe le fils de gauche NOEUD* pFD; // pointe le fils de droite }; // --- Recherche du noeud père d'un noeud fils dans un arbre const NOEUD* AB1_Pere ( const NOEUD* pRacine // E:pointe la racine d'un arbre ,const NOEUD* pFils // E:pointe le noeud fils à rechercher ) // S:pointe le noeud père trouvé ou NULL { Voir(+1,"ENTREE AB1_Pere(%s,%s)",CHAINE(pRacine),CHAINE(pFils)); // --- Quitter si pointeur NULL if (pRacine == NULL) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec racine = NULL" ,CHAINE(pRacine),CHAINE(pFils)); return NULL; } if (pFils == NULL) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec fils = NULL" ,CHAINE(pRacine),CHAINE(pFils)); return NULL; } // --- Quitter si le fils n'a pas de père ! if (pRacine == pFils) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec pere = fils" ,CHAINE(pRacine),CHAINE(pFils)); return pRacine; // OU return NULL; si on considère que le fils n'a pas de père // plutôt que d'être son propre père } // --- Quitter si la racine est le père if (pRacine->pFG == pFils) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec le fils %s trouve a gauche" ,CHAINE(pRacine),CHAINE(pFils),CHAINE(pFils)); return pRacine; } if (pRacine->pFD == pFils) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec le fils %s trouve a droite" ,CHAINE(pRacine),CHAINE(pFils),CHAINE(pFils)); return pRacine; } // --- Chercher le fils dans le sous-arbre de gauche sous la racine Voir(0,"Appel du sous-arbre gauche avec racine = %s",CHAINE(pRacine->pFG)); const NOEUD* pPere = AB1_Pere(pRacine->pFG,pFils); if (pPere) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec pere = %s" ,CHAINE(pRacine),CHAINE(pFils),CHAINE(pPere)); return pPere; } // --- Chercher le fils dans le sous-arbre de droite sous la racine Voir(0,"Appel du sous-arbre droit avec racine = %s",CHAINE(pRacine->pFD)); pPere = AB1_Pere(pRacine->pFD,pFils); if (pPere) { Voir(-1,"SORTIE AB1_Pere(%s,%s) avec pere = %s" ,CHAINE(pRacine),CHAINE(pFils),CHAINE(pPere)); return pPere; } // --- Le fils n'a pas été trouvé Voir(-1,"SORTIE AB1_Pere(%s,%s) avec le fils %s non trouve" ,CHAINE(pRacine),CHAINE(pFils),CHAINE(pFils)); return NULL; } void main() { // On va créer cet arbre : // // +-- FD2 --+-- FD3 // | | // +-- FD1 --+ +-- FG3 // | | // | +-- FG2 --+-- FD4 // | | // RAC --+ +-- FG4 // | // | +-- FD5 --+-- FD6 // | | | // +-- FG1 --+ +-- FG6 // | // +-- FG5 --+-- FD7 // | // +-- FG7 NOEUD FD3 = {"FD3",NULL,NULL}; NOEUD FG3 = {"FG3",NULL,NULL}; NOEUD FD2 = {"FD2",&FG3,&FD3}; NOEUD FD4 = {"FD4",NULL,NULL}; NOEUD FG4 = {"FG4",NULL,NULL}; NOEUD FG2 = {"FG2",&FG4,&FD4}; NOEUD FD1 = {"FD1",&FG2,&FD2}; NOEUD FD6 = {"FD6",NULL,NULL}; NOEUD FG6 = {"FG6",NULL,NULL}; NOEUD FD5 = {"FD5",&FG6,&FD6}; NOEUD FD7 = {"FD7",NULL,NULL}; NOEUD FG7 = {"FG7",NULL,NULL}; NOEUD FG5 = {"FG5",&FG7,&FD7}; NOEUD FG1 = {"FG1",&FG5,&FD5}; NOEUD RAC = {"RAC",&FG1,&FD1}; // --- Test 1 printf("\n*** TEST 1 ***\nChercher le pere de FD6 :\n\n"); const NOEUD* pPere = AB1_Pere(&RAC,&FD6); printf("\nLe pere de FD6 est %s\n\n",CHAINE(pPere)); // --- Test 2 printf("\n*** TEST 2 ***\nChercher le pere de FG1 :\n\n"); pPere = AB1_Pere(&RAC,&FG1); printf("\nLe pere de FG1 est %s\n\n",CHAINE(pPere)); // --- Test 3 printf("\n*** TEST 3 ***\nChercher le pere de RAC :\n\n"); pPere = AB1_Pere(&RAC,&RAC); printf("\nLe pere de RAC est %s\n\n",CHAINE(pPere)); } Qui donne à l'exécution :
*** TEST 1 *** Chercher le pere de FD6 : 00 ENTREE AB1_Pere(RAC,FD6) 01 | Appel du sous-arbre gauche avec racine = FG1 01 | ENTREE AB1_Pere(FG1,FD6) 02 | | Appel du sous-arbre gauche avec racine = FG5 02 | | ENTREE AB1_Pere(FG5,FD6) 03 | | | Appel du sous-arbre gauche avec racine = FG7 03 | | | ENTREE AB1_Pere(FG7,FD6) 04 | | | | Appel du sous-arbre gauche avec racine = NULL 04 | | | | ENTREE AB1_Pere(NULL,FD6) 04 | | | | SORTIE AB1_Pere(NULL,FD6) avec racine = NULL 04 | | | | Appel du sous-arbre droit avec racine = NULL 04 | | | | ENTREE AB1_Pere(NULL,FD6) 04 | | | | SORTIE AB1_Pere(NULL,FD6) avec racine = NULL 03 | | | SORTIE AB1_Pere(FG7,FD6) avec le fils FD6 non trouve 03 | | | Appel du sous-arbre droit avec racine = FD7 03 | | | ENTREE AB1_Pere(FD7,FD6) 04 | | | | Appel du sous-arbre gauche avec racine = NULL 04 | | | | ENTREE AB1_Pere(NULL,FD6) 04 | | | | SORTIE AB1_Pere(NULL,FD6) avec racine = NULL 04 | | | | Appel du sous-arbre droit avec racine = NULL 04 | | | | ENTREE AB1_Pere(NULL,FD6) 04 | | | | SORTIE AB1_Pere(NULL,FD6) avec racine = NULL 03 | | | SORTIE AB1_Pere(FD7,FD6) avec le fils FD6 non trouve 02 | | SORTIE AB1_Pere(FG5,FD6) avec le fils FD6 non trouve 02 | | Appel du sous-arbre droit avec racine = FD5 02 | | ENTREE AB1_Pere(FD5,FD6) 02 | | SORTIE AB1_Pere(FD5,FD6) avec le fils FD6 trouve a droite 01 | SORTIE AB1_Pere(FG1,FD6) avec pere = FD5 00 SORTIE AB1_Pere(RAC,FD6) avec pere = FD5 Le pere de FD6 est FD5 *** TEST 2 *** Chercher le pere de FG1 : 00 ENTREE AB1_Pere(RAC,FG1) 00 SORTIE AB1_Pere(RAC,FG1) avec le fils FG1 trouve a gauche Le pere de FG1 est RAC *** TEST 3 *** Chercher le pere de RAC : 00 ENTREE AB1_Pere(RAC,RAC) 00 SORTIE AB1_Pere(RAC,RAC) avec pere = fils Le pere de RAC est RAC ou Le pere de RAC est NULL si on choisit le return NULL; dans AB1_Pere() Jean-François
|
|
lundi 17 mars 2008 à 14:43:18 |
Re : Recursivité dans un arbre binaire simplement chaînée

daviddubois
|
Bonjour Jean-François,
ça fonctionne maintenant, merci.
À moi d'essayer de comrpendre mainteannt.
encore un grand merci.
|
|
lundi 17 mars 2008 à 14:53:55 |
Re : Recursivité dans un arbre binaire simplement chaînée

jfrancois
|
Ca marche après quelle modif ?
Voici une autre petite modif qui permet de réaliser plus facilement autant de tests qu'on veut ! // --- Réaliser un test de recherche de père void Tester ( const NOEUD* pRacine // E:pointe la racine d'un arbre ,const NOEUD* pFils // E:pointe le fils dont on cherche le père ) { printf("\n\n*** TEST ***\n"); printf("Chercher le pere de %s dans l'arbre de racine %s :\n\n" ,CHAINE(pFils),CHAINE(pRacine)); const NOEUD* pPere = AB1_Pere(pRacine,pFils); if (pPere) printf("\nLe pere de %s est %s dans l'arbre de racine %s\n\n" ,CHAINE(pFils),CHAINE(pPere),CHAINE(pRacine)); else printf("\n%s n'a pas de pere dans l'arbre de racine %s\n\n" ,CHAINE(pFils),CHAINE(pRacine)); } // --- Fonction principale void main() { // On va créer cet arbre : // // +-- FD2 --+-- FD3 // | | // +-- FD1 --+ +-- FG3 // | | // | +-- FG2 --+-- FD4 // | | // RAC --+ +-- FG4 // | // | +-- FD5 --+-- FD6 // | | | // +-- FG1 --+ +-- FG6 // | // +-- FG5 --+-- FD7 // | // +-- FG7 NOEUD FD3 = {"FD3",NULL,NULL}; NOEUD FG3 = {"FG3",NULL,NULL}; NOEUD FD2 = {"FD2",&FG3,&FD3}; NOEUD FD4 = {"FD4",NULL,NULL}; NOEUD FG4 = {"FG4",NULL,NULL}; NOEUD FG2 = {"FG2",&FG4,&FD4}; NOEUD FD1 = {"FD1",&FG2,&FD2}; NOEUD FD6 = {"FD6",NULL,NULL}; NOEUD FG6 = {"FG6",NULL,NULL}; NOEUD FD5 = {"FD5",&FG6,&FD6}; NOEUD FD7 = {"FD7",NULL,NULL}; NOEUD FG7 = {"FG7",NULL,NULL}; NOEUD FG5 = {"FG5",&FG7,&FD7}; NOEUD FG1 = {"FG1",&FG5,&FD5}; NOEUD RAC = {"RAC",&FG1,&FD1}; // --- Tests Tester(&RAC,&FD6); Tester(&RAC,&FG1); Tester(&RAC,&RAC); Tester(&FG1,&FD7); Tester(&FG1,&FD3); // ... } Jean-François
|
|
Cette discussion est classée dans : code, racine, noeudpere, noeudref, tnoeudab1
Répondre à ce message
Sujets en rapport avec ce message
Demande de tutorial et de code source... [ par MaTHieU ]
Salut,Tout d'abord, merci pour ce superbe site !Je cherche des cours pour apprendre à faire des tunnel et du plasma en Visual C++ ou des codes sources
imprimer et image en c++ [ par naney ]
je voudre un code source qui me montre comment imprimer et un autre qui me montre comment inserais une image en c++ (n'importe quel format d'image) ex
Aide pour mega debutant [ par C++ ]
Salut, bon alors je vien d ouvrir c++ mais comment mettre un code sur un boutton ???par exemple ce code comment je doits le mettre sur un bouton :int
code source de la visionneuse microsoft en C++ [ par tompouce ]
j' ai un projet à faire en C++ et je n'y connaît strictement rien AU SECOURS!!Jai fait une fenetre avec un simple menu Fichier** Ouvrir** QuitterQuand
Recherche code source de notepad... [ par PierreP ]
ou de tout autre éditeur de texte assez simple.Merci d'avance !
Fenetre [ par c++ ]
salut, je voudrais savoir le code pour creer une fenetre toute simple rien que le code de la fenetre c tout svp!
Pb code source CMphSock [ par xaviou ]
Salut.J'ai téléchargé le projet "CMphSock" : Utilisation de Winsock sans MFC.Je l'ai compilé en mode Debug : tout est OKJ'ai essayé en mode Release :
(Hors Sujet) Petit coup de gueule [ par Jo ]
Bonjour,Deajs je voudrai m'excuser d'utiliser le forum pour faire passer ce petit message, qui n'a rien a voir avec une demande d'aide ou de conseil d
Salut, je voudrai savoir si qql'un peut me faire un petit code source sur ... [ par Uncle-Shu ]
En faites je voudrai creer une application dans le style de VB (Fichier, Edition,...) !!Merci d'avance et bonne chance !!
tutorial ou code GLUT [ par francky ]
SALUT,je débute avec dev c, et j'aimerais créer une interface portable aussi bien sous window que sous linux;mon probleme: j'ai bien trouver glui, mai
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|