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

Algorithmes et structures de données Discussion :

Insertion d'une occurence dans un arbre


Sujet :

Algorithmes et structures de données

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut Insertion d'une occurence dans un arbre
    Bonjour,

    J'aurais besoin d'aide concernant ceci.
    J'ai créer une fonction qui construit un arbre contenant des opérateurs,des constantes et des variables.

    Les variables peuvent avoir une valeur représenté par un arbre.

    Par exemple:
    pour un parametre donné par exemple x , je lui attribue une valeur représenté par un arbre par exemple
    je dois remplacer toutes les occurences de x dans l'arbre.
    Par exemple si mon arbre est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                           --------+--------                                                             
                            |                     |                                                           
                       ----*----               x                                                            
                     |            |                                                                           
                    x             8

    le nouvel arbre doit etre le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                                     ----------+----------                                               
                                     |                          |                                            
                               ----*----                ----+-----                                      
                              |            |              |            |                                     
                          ---+---         8        ---*---        x                                    
                          |        |                  |         |                                           
                       --*--      x                 3         7                                          
                       |      |                                                                                                            
                       3       7
    Est ce que quelqu'un aurait une manière da faire à m'indiquer?


    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Bon, je suis null en algorithme, mais ne sufirais-t'il pas de parcoyurir l'arbre et pour chaque X rencoutrer, le remplacer par la copie dde l'arbre de remplacemenet?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par JC_Master
    Bon, je suis null en algorithme, mais ne sufirais-t'il pas de parcoyurir l'arbre et pour chaque X rencoutrer, le remplacer par la copie dde l'arbre de remplacemenet?
    Bonjour,

    est ce que tu pourrais m'écrire en pseudo code ,la manière dont tu coderais cela.

    Merci d'avance

  4. #4
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut

    comme l'a dit JC_Master, il suffit de parcourir ton arbre et de remplacer les noeuds contenant X par l'arbre représentatn le nouveau X

    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
     
     
    //La fonction change s'applique sur un noeud this (au depart la tete de ton arbre)
    change(Noeud this, Valeur X,Noeud NewX)
    {
         Si this == NULL return;
     
         Si  this->valeur == X 
         alors 
                  this->Valeur = NewX->Valeur
                  this->FilsDroit = NewX->FilsDroit
                  this->FilsGauche = NewX->FilsGauche
         Sinon
                  change(this->FilsDroit,X,NewX)
                  change(this->FilsGauche,X,NewX)
    }
    XXiemeciel
    XXiemeciel

  5. #5
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par xxiemeciel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //La fonction change s'applique sur un noeud this (au depart la tete de ton arbre)
    change(Noeud this, Valeur X,Noeud NewX)
    {
         Si this == NULL return;
     
         Si  this->valeur == X 
         alors 
                  this->Valeur = NewX->Valeur
                  this->FilsDroit = NewX->FilsDroit
                  this->FilsGauche = NewX->FilsGauche
         Sinon
                  change(this->FilsDroit,X,NewX)
                  change(this->FilsGauche,X,NewX)
    }
    return prend des resources !


    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
    change(Noeud this, Valeur X,Noeud NewX)
    {
         Si this != NULL 
         alors
                Si  this->valeur == X 
                alors 
                       this->Valeur = NewX->Valeur
                       this->FilsDroit = NewX->FilsDroit
                       this->FilsGauche = NewX->FilsGauche
                Sinon
                        change(this->FilsDroit,X,NewX)
                        change(this->FilsGauche,X,NewX)
                FinSi
         FinSi
    }

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par xxiemeciel
    Salut

    comme l'a dit JC_Master, il suffit de parcourir ton arbre et de remplacer les noeuds contenant X par l'arbre représentatn le nouveau X

    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
     
     
    //La fonction change s'applique sur un noeud this (au depart la tete de ton arbre)
    change(Noeud this, Valeur X,Noeud NewX)
    {
         Si this == NULL return;
     
         Si  this->valeur == X 
         alors 
                  this->Valeur = NewX->Valeur
                  this->FilsDroit = NewX->FilsDroit
                  this->FilsGauche = NewX->FilsGauche
         Sinon
                  change(this->FilsDroit,X,NewX)
                  change(this->FilsGauche,X,NewX)
    }
    XXiemeciel
    Bonjour,

    merci de ta réponse.
    J'ai une question à propos du pseudo-code.
    Est ce que la fonction que tu as écrit change toutes les occurences de Valeur ?
    J'ai l'impression qu'une fois qu'elle a trouvé la valeur la fonction fait le changement puis la fonction s'arrete mais ne fais pas cela pour les autres.

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Citation Envoyé par Gryzzly

    merci de ta réponse.
    J'ai une question à propos du pseudo-code.
    Est ce que la fonction que tu as écrit change toutes les occurences de Valeur ?
    J'ai l'impression qu'une fois qu'elle a trouvé la valeur la fonction fait le changement puis la fonction s'arrete mais ne fais pas cela pour les autres.
    C'est une fonction recursive elle passe dans tout les noeud et change toutes les occurences de X dans l'arbre par NewX. Je te suggere de lire les cours de developpez sur le sujet.

    Moi je prend l'avion pour l'Europe dans quelques heures je ne pourrais donc pas continuer cette discussion. Mais je suis sur que d'autres personnes t'aideront si tu as des problemes.

    XXiemeciel
    XXiemeciel

  8. #8
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Citation Envoyé par doccpu
    return prend des resources !
    je ne crois pas non, tout depend du langage ... En l'occurence en C++ return peut servir a terminer une fonction void.

    XXiemeciel
    XXiemeciel

  9. #9
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    Voici le code en C qui répondait à la question que j'ai posé.
    J'ai un problème avec les return car il sont mal placés.
    De plus ,faut'il que je mette *racine =... pour la récursion?
    Merci de me corriger

    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
    Arbre Modif(Arbre *racine, char X, Arbre Nouveau)
    {
      if(*racine == NULL) return NULL;
     
      if((*racine)->lettre == X)
        {
          (*racine)->lettre = Nouveau->lettre;
          (*racine)->gauche = Nouveau->gauche;
          (*racine)->droit = Nouveau->droit;
        }
      else
        {
          *racine = Modif(&((*racine)->gauche),X,Nouveau);
          *racine = Modif(&((*racine)->droit),X,Nouveau);
        } 
      return (*racine);
    }

  10. #10
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Déja, pourquoi tu précède ta variable dynamique d'un *?
    Et si tu le fait, alors tu doit utiliser . au lieu de -> non?
    Enfin, pas de return Racine ou return NULL
    Ta fonction est une fonction void, qui modifier l'objet en paramêttre, et non qui en créé un nouveau. Il faut bien penser que ta fonction s'apelle elle même.
    Enfin, pour terminer, pas de racine = change, seulement un change avec les paramêtres. VOici un code coriger(pas tester )
    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
    26
    27
    28
     
    void Modif(Arbre *racine, char X, Arbre Nouveau)
    {
      if(racine == NULL) return;
     
      if(racine->lettre == X)
        {
          racine->lettre = Nouveau.lettre;
          racine->gauche = Nouveau.gauche;
          racine->droit = Nouveau.droit;
        }
      else
        {
         //Si gauche et droite est un arbre dinamique, on remplace & par &*
          Modif(&(racine->gauche),X,Nouveau);
          Modif(&(racine->droit),X,Nouveau);
        }
    }
     
    //Call :
    Arbre Link;
    Arbre Change;
    Modif(&Link,Change);
     
    //Call :
    Arbre *Link;
    Arbre *Change;
    Modif(&*Link,*Change);
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  11. #11
    Inactif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par JC_Master
    Déja, pourquoi tu précède ta variable dynamique d'un *?
    Et si tu le fait, alors tu doit utiliser . au lieu de -> non?
    Enfin, pas de return Racine ou return NULL
    Ta fonction est une fonction void, qui modifier l'objet en paramêttre, et non qui en créé un nouveau. Il faut bien penser que ta fonction s'apelle elle même.
    Enfin, pour terminer, pas de racine = change, seulement un change avec les paramêtres. VOici un code coriger(pas tester )
    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
    26
    27
    28
     
    void Modif(Arbre *racine, char X, Arbre Nouveau)
    {
      if(racine == NULL) return;
     
      if(racine->lettre == X)
        {
          racine->lettre = Nouveau.lettre;
          racine->gauche = Nouveau.gauche;
          racine->droit = Nouveau.droit;
        }
      else
        {
         //Si gauche et droite est un arbre dinamique, on remplace & par &*
          racine = Modif(&(racine->gauche),X,Nouveau);
          racine = Modif(&(racine->droit),X,Nouveau);
        }
    }
     
    //Call :
    Arbre Link;
    Arbre Change;
    Modif(&Link,Change);
     
    //Call :
    Arbre *Link;
    Arbre *Change;
    Modif(&*Link,*Change);
    Je souhaite que la fonction me renvoye l'arbre modifié pour l'utiliser dans une fonction.

    J'ai mis un * dans Arbre *racine car la racine peut etre modifié.

    Est ce que tu pourrais m'indiquer ou doivent etre placé les return

    Merci

  12. #12
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    En bvoilan modifier cette fonction, te ne feras que la rendre plus compliquer et moin performante, la meilleur solution est de créer une deuxième fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Arbre CopyModified(Arbre racine, Arbre Nouveau)
    {
      //On copie la racine
      Arbre Copy = racine;
      //On modifie la copie
      Modif(&Copy,Nouveau);
      //On renvoi la copie
      return Copy;
    }
    Sinon je te demendais pourquoi tu déréférencais a chaque fois ton pointeur vers la racine, et pourquoi tu continuais a le manipuler comme un pointeur.
    Il faut savoir que Arbre * Branche peut être utiliser soit comme sa : Branche->Feuille ou (*Branche).feuille
    Voila, je pensse que mentenant c'est bon.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il faut savoir que Arbre * Branche peut être utiliser soit comme sa : Branche->Feuille ou (*Branche).feuille
    A mon avis, il doit avoir quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct sarbre
    {
    ....
    }*Arbre;
    D'où le fait que (*racine) nécessite une flèche... Mais c'est un problème de C à ce moment là...

    Par contre, j'aurais une tendance à faire ceci (en fait j'ai simplement suivi l'algo du dessus, ce que tu n'as pas vraiment fait):

    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
     
    void Modif(Arbre racine, char X, Arbre Nouveau)
    {
      if(racine == NULL) return NULL;
     
      if(racine->lettre == X)
        {
          racine->lettre = Nouveau->lettre;
          racine->gauche = Nouveau->gauche;
          racine->droit = Nouveau->droit;
          }
      else
        {
          Modif(racine->gauche,X,Nouveau);
          Modif(racine->droit,X,Nouveau);
        }
    }
    Fais attention par contre au fait que ton arbre Nouveau n'est en mémoire qu'une seule fois donc tout modification de l'arbre nouveau aura une répercussion sur tout l'arbre (ceci est pas mal dans le sens où une seule évaluation est nécessaire

    Par contre, fait attention, vu que tu codes en C, à la déallocation, il faudra faire un seul free sur l'arbre Nouveau et là, ça devient plus complexe...

    Jc

  14. #14
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Désoler pour le = qui trainais, j'ai oublier de l'éffacer ^^
    Sinon, ma fonction fonctione par copie si Nouveau est statique.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

Discussions similaires

  1. Insertion d'une icone dans le SystemTray
    Par Vow dans le forum MFC
    Réponses: 23
    Dernier message: 25/01/2008, 14h50
  2. Réponses: 7
    Dernier message: 27/01/2006, 15h57
  3. Position d'une occurence dans une chaine
    Par Maglight dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2005, 10h08
  4. Insertion d'une image dans la une base mysql...
    Par Angeldu74 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/06/2005, 14h00
  5. insertion d'une date dans visual foxpro
    Par yvescollet dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/05/2005, 15h39

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