
         ***** 3 Febbraio 2000. Direttorio 00-02-03 *****
--------------- COSA SI FA IN QUESTA ESERCITAZIONE -----------------

Sia data la seguente specifica del tipo astratto Albero.


TIPO_ASTRATTO Albero(Elem)

COMMENTO rappresenta strutture gerarchiche composte da elementi, detti nodi,
          di un dominio prefissato, e da archi che collegano tali elementi.

SORTE

     Alb : la sorta di interesse del tipo

     Elem  : la sorta per il dominio dei nodi degli alberi

FUNZIONI

     AlbVuoto: () --> Alb
          precondizioni e postcondizioni per AlbVuoto = a
          pre:  nessuna
          post: a e' l'albero vuoto

     EstVuoto: (Alb) --> Boolean
          precondizioni e postcondizioni per EstVuoto(a) = b
          pre:  nessuna
          post: b e' true se ae l'albero vuoto, false altrimenti

     FaiNodo: (Elem) --> Alb
          precondizioni e postcondizioni per FaiNodo(n) = a
          pre:  nessuna
          post: a e' l'albero composto da un unico nodo radice n

     Radice: (Alb) --> Elem
          precondizioni e postcondizioni per Radice(a) = e
          pre:  a non e' vuoto
          post: e e' la radice di a

     Primo: (Alb) --> Alb
          precondizioni e postcondizioni per Primo(a) = b
          pre:  a non e' vuoto
          post: b e' il primo sottoalbero di a; b e' vuoto se a non ha
                sottoalberi

     Resto: (Alb) --> Alb
          precondizioni e postcondizioni per Resto(a) = b
          pre:  a non e' vuoto
          post: b e' l'albero ottenuto da a eliminando il primo sottoalbero; b
                e' a se a non ha sottoalberi

     FaiAlb: (Alb; Alb) --> Alb
          precondizioni e postcondizioni per FaiAlb(a, c) = d
          pre:  nessuna
          post: d e' l'albero ottenuto da a inserendo c come primo sottoalbero;
                d e' vuoto se a e c sono vuoti; d e' a se c e' vuoto;
                d e' c se a e' vuoto

FINE_TIPO_ASTRATTO

1. Si progetti una classe C++ che realizzi il tipo astratto Albero.
   Si adotti lo schema realizzativo funzionale con condivisione.

2. Si progetti una funzione C++ esterna non friend che prenda un Albero in
   ingresso e ne stampi la rappresentazione parentetica.

3. Si progetti una funzione C++ che dato un albero restituisca l'albero
   speculare

**************************************************************************
*** IMPORTANTE *** IMPORTANTE *** IMPORTANTE *** IMPORTANTE *** IMPORTANTE
**************************************************************************
- Firma registro presenza