Corrigé du TD 3 : constructeurs et arbres binaires

Constructeurs

Ce programme affiche :

Animal::Animal()
Pied::Pied()
Pied::Pied()
Humain::Humain()

Lorsque la liste d'initialisation est vide, l'ordre de construction d'un objet est le suivant :

  • appel du constructeur par défaut de chaque classe mère
  • appel du constructeur par défaut de chaque donnée membre
  • exécution du constructeur de l'objet

Lorsque la liste d'initialisation n'est pas vide, les constructeurs par défaut ne sont pas appelés et leur appel est remplacé par celui indiqué dans la liste d'initialisation. L'exécution du corps du constructeur se fait en dernier dans ce cas également.

Si on supprime le constructeur sans paramètre Animal::Animal(), le programme ne compile plus : le constructeur de la classe Humain comporte un appel implicite au constructeur par défaut de la classe Animal, qui n'existe plus.

Les deux pieds ne peuvent pas être regroupés dans un tableau : il faudrait pour cela que la classe Pied comporte un constructeur par défaut.

Arbre binaire

Fichier Noeud.h

#ifndef Noeud_h
#define Noeud_h
 
#include <string>
 
struct Noeud
{
    std::string valeur;
    Noeud *gauche;
    Noeud *droite;
    Noeud(std::string _valeur);
};
 
#endif // Noeud_h

Fichier Noeud.cpp

#include "Noeud.h"
 
#include <string>
 
Noeud::Noeud(std::string _valeur)
: valeur(_valeur), gauche(0), droite(0)
{
}

Fichier Arbre.h

#ifndef Arbre_h
#define Arbre_h
 
#include <string>
#include "Noeud.h"
 
class Arbre
{
public :
    Arbre();
    ~Arbre();
 
    void insererValeur(std::string const & valeur);
    Noeud* trouver(std::string const & valeur) const;
    void afficher() const;
 
private :
    Noeud* tete;
 
    void detruire(Noeud* courant);
    Noeud* trouver(std::string const & valeur,Noeud* courant) const;
    void afficher(Noeud* courant) const;
};
 
#endif // Arbre_h

Fichier Arbre.cpp

#include "Arbre.h"
 
#include <iostream>
#include <string>
 
#include "Noeud.h"
 
Arbre::Arbre()
: tete(0)
{
}
 
Arbre::~Arbre()
{
    if(tete!=0)
    {
        detruire(tete);
    }
}
 
void
Arbre::insererValeur(std::string const & valeur)
{
    if(!tete)
    {
        tete=new Noeud(valeur);
    }
    else
    {
        Noeud* lieu=trouver(valeur);
        if(lieu->valeur != valeur)
        {
            Noeud* nouveau=new Noeud(valeur);
            if(valeur < lieu->valeur)
            {
                lieu->gauche=nouveau;
            }
            if(valeur > lieu->valeur)
            {
                lieu->droite=nouveau;
            }
        }
        // sinon la valeur est déjà dans l'arbre, on ne fait rien
    }
}
 
Noeud*
Arbre::trouver(std::string const & valeur) const
{
    return trouver(valeur, tete);
}
 
Noeud*
Arbre::trouver(std::string const & valeur, Noeud* courant) const
{
    if(courant==0)
    {
        // non trouvé
        return 0;
    }
    if(valeur < courant->valeur && courant->gauche != 0)
    {
        return trouver(valeur, courant->gauche);
    }
    else if(valeur > courant->valeur && courant->droite != 0)
    {
        return trouver(valeur, courant->droite);
    }
    else
    {
        // valeur == courant->valeur
        return courant;
    }
}
 
void
Arbre::afficher() const
{
    return afficher(tete);
}
 
void
Arbre::afficher(Noeud *courant) const
{
    if(courant != 0)
    {
        if(courant->gauche != 0)
        {
            afficher(courant->gauche);
        }
        std::cout << courant->valeur << " ";
        if(courant->droite != 0)
        {
            afficher(courant->droite);
        }
    }
}
 
void
Arbre::detruire(Noeud* courant)
{
    if(courant->gauche != 0)
    {
        detruire(courant->gauche);
    }
    if(courant->droite != 0)
    {
        detruire(courant->droite);
    }
    delete courant;
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>