begin process at 2012 05 29 15:38:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Maths & Algorithmes

 > 

Petit problème pour créer un arbre binaire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Petit problème pour créer un arbre binaire

dimanche 12 mars 2006 à 21:05:53 | Petit problème pour créer un arbre binaire

dragarth1

Bonjour j'ai un travail à faire pour l'école, il faut que je crée un arbre binaire à partir d'un fichier, comme un arbre généalogique, la racine étant l'enfant, le niveau suivant ce sont les parents, ensuite les grands-parents, etc. Je n'arrive pas à créer l'arbre, chaque fois que j'ajoute un noeud, ma racine change de valeur et je ne comprends vraiment pas pourquoi. Voici mon code source, si vous pouviez m'aider je vous en serait très reconnaissante!

//Classe représentant chacun des noeuds
class Personne
{
private :
 char *NomPersonne;
 char *PrenomPersonne;
 Personne *Pere;
 Personne *Mere;

public :
 Personne(char *Nom, char *Prenom); //constructeur
 char *GetNom();                    //retourne le nom de la personne
 char *GetPrenom();                 //retourne le prénom de la personne
 void SetPere(Personne *pere);      //permet d'ajouter le père
 void SetMere(Personne *mere);      //permet d'ajouter la mère
 Personne *GetPere();               //retourne le père de la personne
 Personne *GetMere();               //retourne la mère de la personne
};

//variables globales
Personne *Racine;
Personne *Nouveau;

//****************
//*****MAIN******
//****************
void main()
{
 int Choix;
 char Fichier[50];
 char *Nom;
 char *Prenom;
 int Niveau;
 AfficherMenu();
 cin>>Choix;
 Racine = NULL;
 while (Choix != 8)
 {
  switch(Choix)
  {
   case 1 : //construire arbre
    cout<<"Veuillez entrer le nom du fichier a charger"<<endl;
    cin>>Fichier;
    ConstruireArbre(Fichier);
    break;
   }
  AfficherMenu();
  cin>>Choix;
 }
 //lorsque les traitements sont terminés, on supprime l'arbre
 if (Racine != NULL)
  SupprimerArbre(Racine);
}

void ConstruireArbre(char *Fichier)
{
 char Nom[30];
 char Prenom[30];

 ifstream FichierEntree(Fichier);
 if (!FichierEntree) //si le fichier n'existe pas
 {
  cout<<"Erreur lors de l'ouverture du fichier";
 }
 else
 {
  Racine = NULL;
  Nouveau = NULL;
  int Niveau = 0;
  while (!FichierEntree.eof())
  {
   for (int i = 0; i < pow(2,Niveau); i++)
   {
    FichierEntree>>Nom;
    FichierEntree>>Prenom;
    Nouveau = new Personne(Nom, Prenom);
    Nouveau->SetPere(NULL);
    Nouveau->SetMere(NULL);
    char *Chemin = GetChemin(i, Niveau); //la fonction getchemin renvoie un chemin binaire (ex 001), dans ce cas-ci, cela voudrait dire qu'à partir de la racine, on doit se rendre à gauche deux fois, ensuite à droite puis on peut insérer
    int Index = 0;
    char Route[50];
    strcpy(Route, Chemin);
    Inserer(Racine, Nouveau, Route, Index);
   }
   Niveau++;
   cout<<Racine->GetNom(); //c'est avec ca que j'ai pu m'apercevoir que mon arbre ne fonctionnait pas
  }
 }
}

void Inserer(Personne *&Courant, Personne *Nouveau, char Chemin[50], int Index)
{
 if (Courant == NULL)
 {
  Racine = Nouveau;
 }
 else
 {
  if (Courant->GetPere() == NULL)
   Courant->SetPere(Nouveau);
  else
  {
   if (Courant->GetMere() == NULL)
    Courant->SetMere(Nouveau);
   else
   {
     if (Chemin[Index] == '0')
    {
     Courant = Courant->GetPere();
     Inserer(Courant, Nouveau, Chemin, (Index + 1));
    }
    else
    {
     Courant = Courant->GetMere();
     Inserer(Courant, Nouveau, Chemin, (Index + 1));
    }
   }
  }
 }
}

//Retourne l'endroit où on doit insérer le noeud
char *GetChemin(int i, int Niveau)
{
 char buffer[50];
 char *Retour;
 char Zero[50];
 itoa (i,buffer,2);

 int Longueur;
 Longueur = strlen(buffer);

 if (Longueur < Niveau)
 {
  strcpy(Zero, "0");
  for (int j = 0; j < Niveau - Longueur - 1; j++)
  {
   strcat(Zero, "0");
  }
  strcat(Zero, buffer);
  Retour = Zero;
  return Retour;
 }
 Retour = buffer;
 return Retour;
}

Je n'ai pas mis tout mon code pour que ce soit moins encombrant, j'espère que c'est quand même compréhensible. Si vous voulez voir mon code au complet, je peux vous en envoyer une copie zippée, je compile avec Microsoft Visual Studio 6.0. Je vous remercie d'avance pour votre aide!

lundi 13 mars 2006 à 01:44:08 | Re : Petit problème pour créer un arbre binaire

Guillemouze

void Inserer(Personne *&Courant, Personne *Nouveau, char Chemin[50], int Index)
{
 if (Courant == NULL)
 {
  Racine = Nouveau;
 }
...
if (Chemin[Index] == '0')
    {
     Courant = Courant->GetPere();
     Inserer(Courant, Nouveau, Chemin, (Index + 1));


au premier appel, c ok, Racine prend la valeur Nouveau.
mais aux tours suivant, a la premiere iteration de ta fonction recursive, c ok, courant != NULL, mais tu fais des appels recursifs, donc quand tu arrive a une feuille de larbre, Courant == NULL, donc tu fixe racine à nouveau, alors que tu devrai pas

au passage tres etrange le *&Courant !!! un pointeru sur une reference :|
lundi 13 mars 2006 à 14:38:06 | Re : Petit problème pour créer un arbre binaire

dragarth1

Oh je vois, merci beaucoup de ton aide, maintenant que je sais ou est le problème ça va être facile à régler!!


Cette discussion est classée dans : arbre, int, char, courant, racine


Répondre à ce message

Sujets en rapport avec ce message

Dans le genre prenant........ [ par Xs ] oui !c 'est trés chiant !j'explique mon pb : j'ai un code source, fais par moi-meme, et dedans, je veux que l'on saisisse des renseignement comme le l int to char ! [ par nullspace ] Voila mon problème !J'ai une résultat sous forme de variable INT, et je veux que ce résultat soit affecté à une variable de type CHAR.Genre, si j'ai 6 tableau char [ par dingue007 ] Voila je dois faire un prog en C++ : un tableau avec les mois de lannée et quand je tape un chiffre il me sort le mois ! mais je narrive pas a faire l conversion de char en int [ par magicoz ] Bonjour,Est-ce qu'il y aurait quelqu'un qui pourrait me dire comment convertir un caractère en un entier ? Un prog assez simple à réaliser, car les sc lire dans un fichier [ par skeul ] Bonjour,je rencontre qqs difficultés a faire une fonction qui lit un fichier et qui rentre la chaine de caractere dans un tableauy a comme un probleme jai un probleme avec ma source!!!!! jai vérifeir et je ne trouve rien...pouvez vous m'aider.... [ par retaks666 ] alors jai veut faire un programme ki génére une suite de caractere d'un nombre donné...et sa marche po... je vous done ma source si vous pouvez m'aide convertir un int en char ou en string [ par mimyne ] Bonjour je voudrai savoir comment on peut faire en c++ pour convertir un int en char ou bien en string la fonction itoa ne marche pas merci vecteur avec int et char [ par Tyroflan ] int **boursemain(){...cin >> nombre;for (unsigned int i=0;i bourse[i] = new int [5];donc je crée autant de vecteurs bourse que l'indique la variable vecteur avec int et char [ par Tyroflan ] int **boursemain(){...cin >> nombre;for (unsigned int i=0;i bourse[i] = new int [5];donc je crée autant de vecteurs bourse que l'indique la variable problème de pointeur sur char (SUPER HYPER IMPORTANT -> juste pour moi...je supose) [ par levraipig ] bonjour à tous, voila moi j'ai un p'ti problème plutot embêtant.... je dois créer un class qui gère les chaines de caractères (ne me demander pas pou


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,307 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales