Arbre binaire en C

Sofi -  
KX Messages postés 19031 Statut Modérateur -
Bonsoir,
Je voudrais poser une question à propos une arbre binaire en C.
Est ce qu'on peux le définir comme ça :
typedef struct noeud * tree;
 struct noeud
{
    int etiquette;
    tree SAG;
    tree SAD;

} typetree;

Et après je fais la fonction par exemple:
int estvide(typetree A)
{
if(A.SAG==NULL || A.SAD==NULL || A.etiquette==NULL)
return 0;
else
return 1;

}
il m'avertit qu'il y des fautes au niveau de 1 ligne :
C:\Users\Desktop\ARBRENOEUD\main.c|29|error: request for member 'SAD' in something not a structure or union|

5 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Il faut mettre directement tes pointeurs dans la structure qui s'appelle elle même :

    typedef struct noeud
    {
        int etiquette;
        struct noeud *SAG;
        struct noeud *SAD;
    }
    typetree;


    Remarque : ta méthode estVide est bancale, etiquette ne peut pas être NULL, et un arbre est vide lorsque ses deux sous-arbres sont vides, pas seulement l'un des deux.

    int estVide(const typetree a)
    {
    	return a.SAG==NULL && a.SAD==NULL;
    }
    0
  2. Sofi
     
    En prenant la structure déjà défini lorsque je fais un appelle récursif de la fonction: comment je peux le déclarer par exemple j'ai la fonction suivante:
    int taille( typetree A)
    {
    int nombre;
    if(estvide(A))
    nombre=0;
    else
    {
    nombre=1+taille(A.SAG)+taille(A.SAD);
    }
    return nombre;

    }
    alors comment je peux faire l'appelle le sous arbre Gauche car lorsque j'ai taille(A.SAG) il m'affiche un erreur
    0
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    Il faut vérifier chaque sous-arbre indépendamment.
    D'ailleurs ta fonction estVide a peu de sens, le simple fait que ton arbre existe implique qu'il contient au moins une valeur, il s'agit plutôt de savoir si c'est une feuille ou non...

    int taille(const typetree A)    
    {    
        int nombre = 1; // il faut compter A !!!    
            
        if (A.SAG!=NULL)    
            nombre+=taille(A.SAG);    
    
        if (A.SAD!=NULL)    
            nombre+=taille(A.SAD);    
    
        return nombre;    
    }
    La confiance n'exclut pas le contrôle
    0
  4. Sofi
     
    le problème c'est pas dans le code mais dans le déclaration de A.SAG par ce qu'on l'a définit comme noeud* mais dans l'appelle récursif on a besoin de taille(typetree A).
    Alors le compilateur n'a pas accepté le type de variable déclaré dans taille(A.SAG).
    En plus le taille dans une arbre est le nombre des noeuds
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    Oups... erreur d'inattention ^^

    C'est avec ton typedef, il faut déclarer typetree comme pointeur puis l'utiliser comme ça !

    typedef struct noeud
    {
        int etiquette;
        struct noeud *SAG;
        struct noeud *SAD;
    } *typetree;
    
    int estVide(const typetree a)
    {
    	return a->SAG==NULL && a->SAD==NULL;
    }
    
    int taille(const typetree a)    
    {    
        int nombre = 1;   
            
        if (a->SAG!=NULL)    
            nombre+=taille(a->SAG);    
    
        if (a->SAD!=NULL)    
            nombre+=taille(a->SAD);    
    
        return nombre;    
    }
    0
    1. Sofi
       
      alors c'est quoi la différence entre *typedetree et typetree .
      En plus pourquoi on utilise la notion (a->SAG) c'est possible en C???!!!
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      En fait on fait typedef struct noeud* typetree comme ça l'arbre a le même type que ses sous arbres qui sont eux même déclarés struct noeud* on peut donc considérer qu'ils sont tous typetree.
      Faire a->SAG est équivalent à faire (*a).SAG mais on utilise plus souvent la flèche dans ce cas.
      0