// Programma che implementa un'albero binario
class nodo {
 nodo sinistro = null;         // Sottoalbero di sinistra (del nodo)
 double chiave;                // Chiave >8)=
 int valore;                   // Valore >8)=
 nodo destro = null;           // Sottoalbero di destra (del nodo)
 static nodo albero = null;    // Albero (della classe)

 nodo (double ch, int val) {   // Costruttore con parametri
  chiave = ch;                 // Inizializza i dati del nodo con i parametri
  valore = val;
 }

 void inserisci (nodo nuovo) {    // Funzione ricorsiva di inserimento
   if (nuovo.chiave < chiave) {   // Confronta il nodo da inserire con 'me', che sono la radice del sottoalbero
     if (sinistro != null)        // Se esiste la radice del sottoalbero
      sinistro.inserisci (nuovo); // Inserisco nel sottoalbero
     else
      sinistro = nuovo;           // Altrimenti il nuovo nodo e' la radice del sottoalebero
   } else {
     if (destro != null)          // Se esiste la radice del sottoalbero
      destro.inserisci (nuovo);   // Inserisco nel sottoalbero
     else
      destro = nuovo;             // Altrimenti il nuovo nodo e' la radice del sottoalebero
   }
 }

 void traversa () {               // Funzione ricorsiva che traversa l'albero
   if (sinistro != null)          // Se esiste il sottoalbero di sinistra (la sua radice) 
     sinistro.traversa ();        // Visito prima il sottoalbero
   System.out.print (chiave);     // Stampo i valori del nodo corrente
   System.out.print (" -> ");
   System.out.println (valore);
   if (destro != null)            // Se esiste il sottoalbero si destra
     destro.traversa ();          // Adesso visito anche quello
 }

 static void nuovo (double ch, int val) { // Funzione statica che crea un nuovo nodo
   nodo n = new nodo (ch,val);            // Alloca un nuovo nodo
   if (albero == null)                    // Se non esiste la radice dell'albero
     albero = n;                          // Allora il nuovo nodo diventera' la radice
   else
     albero.inserisci (n);                // Altrimenti ordina alla radice di inserire
 }

 public static void main (String [] args) { // Programma principale
   int i;
   for (i = 0; i < 20; i++)                 // 20 ripetizioni
     nuovo (java.lang.Math.random(),i);     // Crea 20 nodo, chiave casuale ecc.
   albero.traversa ();                      // Traversa l'albero, dalla radice
   albero = null;                           // Dereferenzia la radice, per elimenare l'albero
 } 
}