Arbrebinaire

Signaler
Messages postés
3
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
9 mai 2010
-
Messages postés
3
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
9 mai 2010
-
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

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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]
Messages postés
3
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
9 mai 2010

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
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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]
Messages postés
3
Date d'inscription
mercredi 7 novembre 2007
Statut
Membre
Dernière intervention
9 mai 2010

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.