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 :

Version itérative de la copie d'un ABR


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 40
    Points
    40
    Par défaut Version itérative de la copie d'un ABR
    Bonsoir,

    Je voudrais implémenter la version itérative de la copie d'un arbre binaire de recherche dans un autre ABR.

    La version récursive est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    node * copier(node* A, node* B)
    {
      if(A!=NULL) 
       {
           B=inserer_rec(B,A->val);
           copier(A->FG,B);
           copier(A->FD,B);
       }
       return B;
    }
    Pour la version itérative j'ai pensé à utiliser une file dont les cellules renferment les nœuds de l'arbre originale:

    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
     
    node * copie(node* A, node* B)
     {
         File* F;
         node* root; cellule* a;
     
         if (A!=NULL)
          enfiler(A,F);
         while(!FileEstVide(F))
         {
             root=F->tete->valeur;   /* la cellule contient un nœud */
             B=inserer_rec(B,root->val);   /* le nœud contient un entier */
             defiler(F);
             enfiler(root->FG,F);
             enfiler(root->FD,F);
         }
     
         return B;
     }
    Je n'arrive pas à récupérer l'arbre B pour l'afficher.
    Pourriez-vous m'aider à repérer le problème?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Tous les algos de parcours itératifs sont sur la page wikipedia : Tree traversal#Depth-first search implementation, lien en anglais
    Sur cette page tu as aussi 1 lien vers l'algo de Morris pour 1 parcours infixe sans pile.

    Je pense qu'il faut faire 1 parcours infixe ("in-order traversal") pour insérer les éléments dans le nouveau arbre 1 à 1.

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 40
    Points
    40
    Par défaut
    Bonsoir

    j'ai rectifié mon code en initialisant ma file à NULL, et cela a bien marché.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par foetus Voir le message
    Tous les algos de parcours itératifs sont sur la page wikipedia : Tree traversal#Depth-first search implementation, lien en anglais
    C'est décevant que tous leurs parcours "itératifs" soient avec pile (et donc, récursifs déguisés).
    Il y a moyen de faire du vrai itératif sur un parcours d'arbre, mais ça nécessite que chaque nœud maintienne un pointeur sur son parent en plus des pointeurs vers ses enfants.

    ↓Tu as raison.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    En même temps j'ai envie de dire que les algos récursifs sont extrêmement bien adapté sur des structures de donnée récursives. Passer en itératif n'apportera sans doute pas grand chose et nuira certainement autant à la lisibilité qu'à la maintenance du code.

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

Discussions similaires

  1. [Turbo Pascal] Version itérative de la fonction Construire
    Par imene_s dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 09/02/2015, 17h32
  2. Réponses: 5
    Dernier message: 23/10/2012, 16h52
  3. Numéro de version perdu lors de la copie d'un fichier.
    Par Geache dans le forum Windows XP
    Réponses: 4
    Dernier message: 23/11/2009, 11h06
  4. Copies et versions piratées de win xp
    Par vg-matrix dans le forum Windows XP
    Réponses: 1
    Dernier message: 05/09/2008, 17h36
  5. Réponses: 2
    Dernier message: 16/12/2006, 11h01

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