Arbre binaire en C
Fermé
Sofi
-
20 sept. 2011 à 21:49
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 sept. 2011 à 23:18
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 sept. 2011 à 23:18
A voir également:
- Arbre binaire en C
- Codage binaire - Guide
- Arbre généalogique famille michelin - Télécharger - Généalogie
- Pour participer à un jeu, josé doit donner un nom de code à chacun des membres de son équipe. il veut utiliser le code binaire. il essaie avec seulement 3 bits. mais cela ne suffit pas. combien de membres n'auront pas de code ? ✓ - Forum Powerpoint
- Glandier arbre ✓ - Forum Loisirs / Divertissements
- L’ordinateur a toujours fonctionné en binaire ? ✓ - Forum Programmation
5 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
20 sept. 2011 à 22:11
20 sept. 2011 à 22:11
Il faut mettre directement tes pointeurs dans la structure qui s'appelle elle même :
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.
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; }
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
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
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié par KX le 20/09/2011 à 22:38
Modifié par KX le 20/09/2011 à 22:38
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...
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
20 sept. 2011 à 23:00
20 sept. 2011 à 23:00
Oups... erreur d'inattention ^^
C'est avec ton typedef, il faut déclarer typetree comme pointeur puis l'utiliser comme ça !
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; }
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
20 sept. 2011 à 23:18
20 sept. 2011 à 23:18
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.
Faire a->SAG est équivalent à faire (*a).SAG mais on utilise plus souvent la flèche dans ce cas.