Un albero binario di interi è un grafo orientato aciclico finito costituito da un nodo,
chiamato radice, etichettato da un intero, e, eventualmente, un figlio destro e un
figlio sinistro, anch’essi alberi binari di interi. Non esiste l’albero vuoto (senza nodi).
Se un nodo ha figli, allora ne ha esattamente due. Un albero con un solo nodo
(ovvero senza figli) è chiamato foglia.

Definire una classe MyBTree che rappresenti il tipo di dato astratto degli
alberi binari di interi, implementando la seguente interfaccia BTree:

public interface BTree { // interfaccia degli alberi binari

    void flip (); // restituisce una copia speculare dell'albero

    void depthstampa (); // stampa una visita in profondita' in ordine anticipato
    
    void breadthstampa ();
    // stampa una visita in ampiezza (breadthfirst), ovvero per livelli
}

Esempio.

Supponiamo di rappresentare un albero con radice etichettata da n, figlio sinistro t1
e figlio destro t2 mediante una tripla (n, t1, t2), e supponiamo che (n) rappresenti
una foglia etichettata con n; supponiamo che t sia l’albero (1, (2, (3), (4)), (5)),
allora, dopo l’esecuzione di t.flip(), t sarà l’albero (1, (5), (2, (4), (3))).

Il metodo depthstampa() stampa una visita in profondità in ordine anticipato dell’albero.
Se t = (1, (2, (3), (4)), (5)) allora t.depthstampa() stampa 1 2 3 4 5

Il metodo breadthstampa() stampa una visita in ampiezza dell’albero.
Se t = (1, (2, (3), (4)), (5)) allora t.depthstampa() stampa 1 2 5 3 4

In combinazione col seguente main, la classe MyBTree deve produrre il risultato:

1 2 3 4 5
1 2 5 3 4
1 5 2 4 3
1 5 2 4 3

public class TestBTree {

    public static void main(String[] args) {

        BTree T1 = new MyBTree(1, new MyBTree(2, new MyBTree(3), new MyBTree(4)), new MyBTree(5));
        T1.depthstampa();
        T1.breadthstampa();

        BTree T2 = new MyBTree(1, new MyBTree(2, new MyBTree(3), new MyBTree(4)), new MyBTree(5));
        T2.flip();
        T2.depthstampa();
        T2.breadthstampa();
    }
}