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 :

Arbre Binaire de Recherche : Suppression d'un noeud


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 72
    Points : 44
    Points
    44
    Par défaut Arbre Binaire de Recherche : Suppression d'un noeud
    Bonjour,

    Je fais un programme qui utilise des arbres binaire de recherche mais la dernière fonction me pose problème. Elle doit supprimer le noeud ou la feuille recherché(e).

    Voici ma struture d'arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct snoeud{
      int valeur;
      struct snoeud *fg;
      struct snoeud *fd;
    } noeud;
     
    typedef noeud * arbre;
    Voici la fonction telle qu'elle est en ce moment :
    (je l'ai déjà modifiée dans tous les sens mais c'est la version qui me donne les résultats les plus correctes)
    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
    void supprimerElement(arbre *a, int val){
      if( (*a)->valeur == val )
        {
          if( (*a)->fg )
    	{
    	  (*a) = (*a)->fg;
    	  while( (*a)->fd )
    	    {
    	      (*a) = (*a)->fd;
    	    }
    	  (*a)->fd = (*a)->fd;
    	  (*a) = (*a)->fg;
    	}
          else
    	{
    	  (*a) = (*a)->fd;
    	 }
        }
      else
        {
          if( val < (*a)->valeur )
    	{
    	  supprimerElement( &(*a)->fg, val);
    	}
          else
    	{
    	  supprimerElement( &(*a)->fd, val);
    	}
        }
    }
    Je sais qu'il manque des tests mais je n'arrive pas à les implémenter correctement...

    Si vous avez un conseil à me donner je suis preneur
    Merci d'avance!

    A bientôt

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 72
    Points : 44
    Points
    44
    Par défaut
    Re'

    je viens d'avoir une idée : la création d'une nouvelle fonction pour replacer correctement un fils d'un noeud.

    voici ce que ca donne :
    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
    void supprimerElement(arbre *a, int val){
      if( *a == NULL ) printf("Rien a supprimer\n");
      if( (*a)->valeur == val )
        {
          if( (*a)->fg == NULL ) (*a) = (*a)->fd;
          else
    	if ( (*a)->fd == NULL ) (*a) = (*a)->fg;
    	else
    	  replacerFils( &(*a)->fg );
        }
      else
        {
          if( val < (*a)->valeur )
    	{
    	  supprimerElement( &(*a)->fg, val);
    	}
          else
    	{
    	  supprimerElement( &(*a)->fd, val);
    	}
        }
    }
     
    void replacerFils( arbre *a){
      if( (*a)->fd == NULL )
        (*a) = (*a)->fg;
      else
        replacerFils( &(*a)->fg );
    }
    je n'ai plus d'erreur mais les résultats sont parfois faux pour des noeuds à 2 fils

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Moi je ferais comme celà :
    J'ai supposé, d'après ce qui est écrit, que arbre est un pointeur vers une structure
    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
    arbre supprimerElement(arbre a, int val)
    {
        arbre tmp;
        if( (a->valeur == val )
        {
           if( a->fg != NULL)
           {
              // on accroche a->fd au fils le plus à droite du fils gauche 
              tmp = a->fg;
              while(tmp->fd != NULL)
              {
                 tmp = tmp->fd;
              }
              tmp->fd = a->fd;
              a = a->fg;
           }
           else
           {
               a = a->fd;
           }
        }
        else
        {
            if( val < a->valeur )
            {
                a->fg = supprimerElement( a->fg, val);
            }
            else
            {
                a->fd = supprimerElement( a->fd, val);
            }
        }
        return a;
    }
    PS : il y a peut-être lieu de libérer le noeud lorsque val = a ->valeur.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 72
    Points : 44
    Points
    44
    Par défaut
    merci beaucoup Trap D!

    j'avais déjà essayé en utilisant un arbre temporaire mais je me compliquais bien et n'arrivais jamais au bon résultat.
    de plus j'étais persuadé que c'était possible sans mais finalement je pense que non

    encore merci
    @bientôt

    PS : désolé du retard, vacance oblige j'avais oublié ceci 8)

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. Réponses: 6
    Dernier message: 15/01/2014, 21h15
  3. Algorithme de suppression d'un élément dans un arbre binaire de recherche
    Par mohsenuss91 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 24/12/2011, 12h05
  4. Réponses: 2
    Dernier message: 07/12/2009, 11h43
  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