2
souvent préférée. Une autre alternative consiste à avoir accès à l’enfant le plus à gauche d’un
nœud, et une autre fonction qui a accès au frère/sœur de droite d’un nœud. Ce qui suit montre la
déclaration de classes pour les arbres généraux et leur nœuds basée sur cette approche.
// classe nœud pour arbre général
template <class Elem>
class GTNode {
public:
GTNode(const Elem&); // Constructeur 1
GTNode(const Elem&, GTNode<Elem>*, GTNode<Elem>*, GTNode<Elem>*); //
Constructeur 2
~GTNode(); // Destructeur
Elem value(); // Retourne la valeur du noeud
bool isLeaf(); // VRAI si le nœud est une feuille
GTNode* parent(); // Retourne le parent
GTNode* leftmost_child(); // Retourne le premier enfant
GTNode* right_sibling(); // Retourne le frère de droite
void setValue(Elem&); // Assigne une valeur au noeud
void insert_first(GTNode<Elem>* n); // insère comme premier enfant
void insert_next(GTNode<Elem>* n); // insère comme frère de droite
void remove_first(); // Enlève le premier enfant
void remove_next(); // Enlève le frère de droite
};
// Classe arbre general
class GenTree {
private
void printhelp(GTNode*); // print helper function
public:
GenTree(); // Constructeur
~GenTree(); // Destructeur
void clear(); // libère les noeuds
GTNode* root(); // Retourne la racine
void newroot(Elem, GTNode*, GTNode*); // fusionne deux arbres
};