IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Récursive parcours d'arbre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut Récursive parcours d'arbre
    Bonjour à tous,

    Voici mon problème: j'ai créé une fonction en C qui doit parcourir un arbre binaire et renvoyer un pointeur sur un noeud dès qu'il trouve une valeur que je lui donne en paramètre, cette fonction marche dans 80% des cas, mais dans 20% des cas elle me renvoie le pointeur sur le dernier noeud de l'arbre.
    Je précise que j'effectue un parcours préfixe et qu'il s'agit d'un arbre binaire, je fais un controle dans la fonction (cf code: noeud cherché, noeud trouvé) et qu'il présente le pointeur sur le bon noeud, en faisant le même contrôle dans le main sur la valeur de retour je m'aperçoit que le pointeur n'est plus le bon.

    Quelqu'un aurait-il une idée de la raison de ce comportement?

    un grand merci pour vos réponses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    NODE* parcoursVal (NODE * ptrNod, int valName) {
     
    NODE* ptrRd;
     
     
     if (ptrNod->name == valName) 
     {
     printf("noeud cherché %i, noeud trouvé %i\n",valName,ptrNod->name);
     
     return ptrNod;
     }
     
     if (ptrNod->filsg != NULL) {
      parcoursVal (ptrNod->filsg, valName);
     }
     
     if (ptrNod->filsd != NULL) {
     parcoursVal (ptrNod->filsd, valName);
     }
     
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu arrives en compiler ? Parce que ta fonction ne renvoie pas de valeurs dans tous les cas. Je pense qu'il faudrait renvoyer quelque chose si le fils gauche et le fils droit sont nuls.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    merci de ta réponse,

    effectivement ça compile et ne plante pas, ton idée est intéressante mais comme il s'agit d'un parcours prefixe, la valeur est checkée et donc le return est avant les fils je pense, même si ils sont nuls

    je complète en rajoutant l'appel dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ptrRandNode = parcoursVal (root, subT);
     
    printf("verif: %i\n",ptrRandNode->name); //verif:
    et un affichage typique de l'erreur:

    noeud au hasard dans le sous arbre: 3
    noeud cherché 3, noeud trouvé 3
    verif: 9

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    J'aimerais savoir également si ce genre de return dans une récursive est conforme, ce dont je commence à douter,
    pour information si je lui demande de trouver une valeur qui n'existe pas dans l'arbre il me renvoie également le pointeur sur le dernier noeud de l'arbre mais il n'est pas rentré dans le if de la fonction dans ce cas

  5. #5
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Citation Envoyé par trollichinelle Voir le message
    J'aimerais savoir également si ce genre de return dans une récursive est conforme, ce dont je commence à douter,
    pour information si je lui demande de trouver une valeur qui n'existe pas dans l'arbre il me renvoie également le pointeur sur le dernier noeud de l'arbre mais il n'est pas rentré dans le if de la fonction dans ce cas
    Le cas d'arrêt est une des choses les plus importantes dans des fonctions récursives. Dans ton cas, s'il ne s'agit pas du bon noeud et que les fils sont nuls, que ce passe-t-il ??
    C'est tout à fait normal que le résultat retourné est erroné si le nombre n'est pas trouvé, puisque tu imprimes le retour d'une fonction ne renvoyant rien.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je ne comprends pas vraiment, à mon avis, Gastiflex a raison, il faut également renvoyer le résultat dans le cas des fils.
    Oulah oui. C'est pas à ça que je pensais, mais c'est vrai qu'il faudrait que ce soit comme ça.
    Ce que je pensais, c'est le return dans le cas où la valeur n'est pas trouvée et où il n'y a pas de fils gauche et droite. En résumé avec les ajouts de Jerome :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    NODE* parcoursVal (NODE * ptrNod, int valName) {
     
    NODE* ptrRd;
     
     
     if (ptrNod->name == valName) 
     {
     printf("noeud cherché %i, noeud trouvé %i\n",valName,ptrNod->name);
     
     return ptrNod;
     }
     
    if(ptrNod->filsg == NULL && ptrNod->filsd == NULL)
      return NULL;
     
     if (ptrNod->filsg != NULL) {
      return parcoursVal (ptrNod->filsg, valName);
     }
     
     if (ptrNod->filsd != NULL) {
     return parcoursVal (ptrNod->filsd, valName);
     }
     
    }

  7. #7
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Citation Envoyé par trollichinelle Voir le message
    comme il s'agit d'un parcours prefixe, la valeur est checkée et donc le return est avant les fils je pense, même si ils sont nuls
    Je ne comprends pas vraiment, à mon avis, Gastiflex a raison, il faut également renvoyer le résultat dans le cas des fils.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (ptrNod->filsg != NULL) {
      return parcoursVal (ptrNod->filsg, valName);
     }
     
     if (ptrNod->filsd != NULL) {
      return  parcoursVal (ptrNod->filsd, valName);
     }
    Sinon le résultat ne sera pas propagé jusqu'à la fonction appelante de départ.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcours d'arbre et sauvegarde en binaire
    Par irons dans le forum C
    Réponses: 8
    Dernier message: 20/06/2007, 22h47
  2. [WD11]Problème de parcours d'arbre
    Par fabpeden dans le forum WinDev
    Réponses: 1
    Dernier message: 17/04/2007, 09h46
  3. Requete sur table récursive pour construire arbre
    Par dacid dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/06/2006, 17h17
  4. [JSTL] Problème de parcours d'arbre en XML
    Par slashmax dans le forum Taglibs
    Réponses: 1
    Dernier message: 04/12/2005, 17h13
  5. Parcours d'arbre sans récursivité
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 12/04/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo