Arbrebinaire

jbitsch68 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 9 mai 2010 - 9 janv. 2010 à 11:59
jbitsch68 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 9 mai 2010 - 9 janv. 2010 à 16:47
bonjour,

j'essaye de créer un arbre binaire.

voici le code :

--- les classes noeud et arbrebinaire

#include 

class Noeud;

class ArbreBinaire
{
      public :
             void affiche () const ; 
             void afficheRacine() const;
             ArbreBinaire(int i);
             ArbreBinaire();
             
      private :
              Noeud * racine ; 
              
};


class Noeud{

      friend class ArbreBinaire;
      
      public :
            
      private :
              int info ; 
              ArbreBinaire fg, fd ;
              Noeud(int i); 
      
};


---l'implémentation

#include "ArbreBinaire.h"

void ArbreBinaire::affiche () const 
{
     if (racine != 0 )
     {  std::cout<<racine->info << " ";
        racine->fg.affiche();
        racine->fd.affiche();
     }
     
}

void ArbreBinaire::afficheRacine()const
{
std::cout<<racine->info<<" est la racine de l'arbre"<<std::endl;
}

ArbreBinaire::ArbreBinaire():racine(0){}
ArbreBinaire::ArbreBinaire(int i):racine(new Noeud(i)){}
Noeud::Noeud(int i ):info(i),fg(),fd(){}


--- et le main

#include 
#include "ArbreBinaire.h"
using namespace std ; 
int main () 
{   

   ArbreBinaire * arbre = new ArbreBinaire(5);
   
    
   arbre->afficheRacine();
   
   system("pause");
}



Le code devrai afficher 5 mais ne fait rien, je vois absolument pas pourquoi.

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2010 à 15:09
Le code devrai afficher 5 mais ne fait rien, je vois absolument pas pourquoi.

Chez moi, il affiche 5.

using namespace std;

Jamais ! Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Evite aussi l'utilisation de la commande "system".

ArbreBinaire * arbre = new ArbreBinaire(5);

Non seulement tu ne fais pas de delete après, mais en plus on pourrait tout à fait écrire:
#include 
int main ()
{
  ArbreBinaire arbre(5);
  arbre.afficheRacine();

  return 0;
}


Le friend est à utiliser avec parcimonie. Ici, il ne sert pas à grand chose. Dans ta classe Racine, tu as ArbreBinaire fg, fd. Ils devraient être des pointeurs.

Bon voici une version un peu plus propre:

#include 

class ArbreBinaire
{
private:
  struct Noeud
  {
    int _info;
    ArbreBinaire* _fg;
    ArbreBinaire* _fd;
    Noeud(int i)
      : _info(i), _fg(0), _fd(0)
    {
    }
    ~Noeud()
    {
      delete _fg;
      delete _fd;
    }
  };

public:
  ArbreBinaire();
  ArbreBinaire(int i);
  ~ArbreBinaire();
  void affiche() const;
  void afficheRacine() const;
private:
  Noeud* _racine;
};

ArbreBinaire::ArbreBinaire()
  : _racine(0)
{
}

ArbreBinaire::ArbreBinaire(int i)
  : _racine(new Noeud(i))
{
}

ArbreBinaire::~ArbreBinaire()
{
  delete _racine;
}

void ArbreBinaire::affiche() const
{
  if (_racine == 0)
    return;
  std::cout << _racine->_info << " ";
  if (_racine->_fg != 0)
    _racine->_fg->affiche();
  if (_racine->_fd != 0)
    _racine->_fd->affiche();
}

void ArbreBinaire::afficheRacine() const
{
  std::cout << _racine->_info
    << " est la racine de l'arbre"
    << std::endl;
}

#include 
#include "ArbreBinaire.h"

int main ()
{
  ArbreBinaire arbre(5);
  arbre.afficheRacine();

  return 0;
}


A mon sens, on peut se passer de la classe Noeud, tous faire dans la classe ArbreBinaire, et si tu veux masquer certaines opérations, créer un proxy dessus.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
jbitsch68 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 9 mai 2010
9 janv. 2010 à 16:00
Oui merci pour tout ces renseignements.
C'est notre prof qui implémente les arbres de cette manière..., mais je trouve ton implémentation aussi très correcte Merci.
Pour le new c'est une habitude de java, désolé.


je viens de télécharger Codeblock et la ca marche, avec dev cpp(une version beta ) cela n'a pas fonctionné.


Est ce que vous savez si un framework existe pour l'affichage graphique des arbres binaires ? ou graph ?

Merci
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 janv. 2010 à 16:14
vec dev cpp(une version beta ) cela n'a pas fonctionné.

Dev-cpp n'est plus tenu à jour depuis des années :)

Est ce que vous savez si un framework existe pour l'affichage graphique des arbres binaires ? ou graph ?

Non pas vraiment. Il y a bien dotty issue de la collection d'outil graphviz, mais ça dessine un graphe en fonction d'une sortie spécifique, et je ne sais pas si c'est disponible sous Windows (Sous Linux, c'est sur).

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
jbitsch68 Messages postés 3 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 9 mai 2010
9 janv. 2010 à 16:47
Oui c'est disponible sous Windows "au pire" (au mieux) je l'aurais installé sous fedora

Il faut utiliser GVedit (beta) pour écrire le graph et dotty pour l'afficher.


merci.
0
Rejoignez-nous