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 :

Problème suppression dans un arbre


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut Problème suppression dans un arbre
    Bonjour,
    Je révisais mon cours sur les arbres et il y a quelquechose que je n'arrive pas à comprendre.
    Voici la structure d'arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct Noeud Noeud;
    struct Noeud
    {
        int info;
        struct Noeud* sag;
        struct Noeud* sad;
    };
    typedef struct Noeud* Ptr_noeud;
    Et voila l'algo de suppression d'un élément :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    int supprimer(Ptr_noeud *tete, int x)
    {
        Ptr_noeud tmp = NULL, max = NULL;
        Ptr_noeud *pp = NULL;
        int ok = 0;
     
        if ((*tete) != NULL)
        {
            if ((*tete)->info < x)
            {
                supprimer(&((*tete)->sad), x);
            }
            else if ((*tete)->info > x)
            {
                supprimer(&((*tete)->sag), x);
            }
            else
            {
                ok = 1;
     
                if ((*tete)->sag == NULL)
                {
                    tmp = (*tete);
                    (*tete) = (*tete)->sad;
                    free(tmp);
                }
                else if ((*tete)->sad == NULL)
                {
                    tmp = (*tete);
                    (*tete) = (*tete)->sag;
                    free(tmp);
                }
                else
                {
    				pp = &((*tete)->sag);
     
    				while ((*pp)->sad != NULL)
    				{
                        pp = &((*pp)->sad);
                    }
     
                    max = *pp;
     
                    //A partir de la je comprends pas!
                    *pp = max->sag; 
     
                    (*tete)->info = max->info;
     
                    supprimer(pp, max->info);
                }
            }
        }
     
        return ok;
    }
    Donc en gros on commence par chercher l'élément et après on le supprime en fonction du nombre de fils qu'il a. Le problème c'est quand il en a deux, on est obligé de chercher le plus grand élément de son sous arbre gauche et de remplacer les deux éléments. Ce que je comprends pas c'est cette ligne : *pp = max->sag; En gros on met dans pp l'adresse de max->sag et après fait : supprimer(pp, max->info); Mais lors de la suppression, max->info se trouve 'au desus', donc il va jamais le trouver, donc jamais le supprimer ?

    Merci de votre aide.

    PS : Cet algo fonctionne, c'est juste que je comprends pas pourquoi !

  2. #2
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Bonjour, en effet ton programme est astucieux,
    pas tres complexe une fois bien compris mais faut le comprendre.
    explication :
    on s'intéresse que à la fin de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    				pp = &((*tete)->sag);
     
    				while ((*pp)->sad != NULL)
    				{
                        pp = &((*pp)->sad);
                    }
    On a trouvé le noeud le plus petit du sous arbre gauche, il a la bonne propriété pour remplacer tete, sans changer les caractéristique de ton arbre (de recherche).

    Maintenant on place ça valeur dans le noeud tete. Ainsi, on a supprimé
    tete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    max = *pp;
     
                    //A partir de la je comprends pas!
                    *pp = max->sag; 
     
                    (*tete)->info = max->info;
    Maintenant on supprime le noeud qui a remplacé tete.
    [oupps] petite modification on a deja supprimé pp avec *pp = max->sag;
    [oupps] je pense que la partie de code la ne sert à rien mais à vérifier.
    [oupps] en effet un free(max) serai plus approprié ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                    supprimer(pp, max->info);
    bye bonnes révisions

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Je te remercie pour ton aide, en effet la dernière ligne supprimer ne sert à rien!

Discussions similaires

  1. Suppression dans un arbre binaire de recherche
    Par allomona dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 06/12/2014, 08h51
  2. Problème de suppression dans un arbre binaire ordonné
    Par Odenelle dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 04/01/2014, 13h18
  3. Problème "suppression dans une table"
    Par dekalima dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2011, 10h39
  4. Problème suppression et MAJ dans un arbre
    Par scary dans le forum C
    Réponses: 12
    Dernier message: 22/06/2009, 17h12
  5. Suppression dans un arbre binaire de recherche
    Par zeine77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2007, 20h40

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