// Programma che implementa un'albero binario abstract class nodobase { nodobase sinistro = null; // Sottoalbero di sinistra (del nodo) nodobase destro = null; // Sottoalbero di destra (del nodo) static nodobase albero = null; // Albero (della classe) nodobase () { // Costruttore che inserisce direttamente nell'albero if (albero == null) // Se non esiste la radice dell'albero albero = this; // Allora il nuovo nodo diventera' la radice else albero.inserisci (this); // Altrimenti ordina alla radice di inserire } abstract boolean compare (nodobase nuovo); // Metodo astratto di confronto abstract void print (); // Metdodo astratto di stampa void inserisci (nodobase nuovo) { // Funzione ricorsiva di inserimento if (compare (nuovo)) { // 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 print (); // Stampa il contenuto del nodo if (destro != null) // Se esiste il sottoalbero si destra destro.traversa (); // Adesso visito anche quello } } class nodo extends nodobase { double chiave; // Chiave >8)= int valore; // Valore >8)= nodo (double ch, int val) { // Costruttore con parametri chiave = ch; // Inizializza i dati del nodo con i parametri valore = val; } boolean compare (nodobase nuovo) { // Implementazione del metodo astratto della superclasse return ((nodo) nuovo).chiave < chiave; // Confront ai valori - deve fare un type cast } void print () { // Implementazione del metodo astratto della superclasse System.out.print (chiave); // Stampo i valori del nodo corrente System.out.print (" -> "); System.out.println (valore); } public static void main (String [] args) { // Programma principale int i; for (i = 0; i < 20; i++) // 20 ripetizioni new nodo (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 } }