-- Nom du fichier		: Arbre_G.ads
-- Auteur(s)			: HRR
-- Date de creation		: 92
-- But					: Specification du paquetage realisant le type
--						: arbre binaire minimal
-- Date de modification	: 1993/AGD
-- Motif				: Mise en forme et tests
-- Date de modification	: 1998/P.Farina
-- Motif				: Adaptation Ada95
-- Remarques			: Corps Arbre_G.adb
--						: Test Arbre_T.ada

generic

  type T_Element is private;	-- Type des elements de l'arbre

package Arbre_G is

type T_Arbre is private;
Arbre_Vide : constant T_Arbre;

-- CONSTRUCTEURS

procedure Effacer(Arbre: in out T_Arbre);
-- Efface tous les elements d'un arbre et en faire un arbre vide

function Feuille(Element: in T_Element) return T_Arbre;
-- Cree un arbre ne comportant qu'une feuille

procedure Modifier_Racine(Arbre: in out T_Arbre; Element: in T_Element);
-- Remplacer l'etiquette de la racine

procedure Accrocher_Gauche(Arbre: in out T_Arbre; Gauche: in T_Arbre) ;
-- Accroche a l'arbre le sous-arbre gauche 

procedure Accrocher_Droit(Arbre: in out T_Arbre; Droit: in T_Arbre);
-- Accroche a l'arbre le sous-arbre droit

procedure Decrocher_Gauche(Arbre: in out T_Arbre; Gauche: out T_Arbre) ;
-- Decroche le sous-arbre gauche de l'arbre 

procedure Decrocher_Droit(Arbre: in out T_Arbre; Droit: out T_Arbre);
-- Decroche le sous-arbre droit de l'arbre

-- SELECTEURS

function Vide (Arbre: in T_Arbre) return Boolean;
-- Verifie si un arbre est vide

function Racine(Arbre: in T_Arbre) return T_Element;
-- Donne l'etiquette de la racine

function Gauche(Arbre: in T_Arbre) return T_Arbre;
-- Donne le sous-arbre gauche

function Droit(Arbre: in T_Arbre) return T_Arbre;
-- Donne le sous-arbre droit

Erreur_Arbre_Vide : exception;
-- Operation impossible car l'arbre est vide

Erreur_Arbre_Plein  : exception;
-- Operation impossible car l'arbre est plein

private

  -- Definition complete du type T_ARBRE
  type Noeud;						-- Type de la cellule
  type T_Arbre is access Noeud;		-- Pointeur sur la cellule
  
  -- pour eviter un conflit avec notre dispose   
  pragma Controlled(T_Arbre);
  
  Arbre_Vide : constant T_Arbre := null;
  
  type Noeud is						-- Definition complete de la cellule
    record	
	Etiquette: T_Element;			-- Champ information
	Gauche,Droit: T_Arbre;			-- Fils gauche et droit
    end record;

end Arbre_G;
