Avrei un disperato bisogno che qualcuno mi spieghi come sistemare un problema, ho un esercizio:

codice:
Si fornisca un'efficiente implementazione dell'interfaccia
BSTSet270710<E>, come mostrata nella pagina successiva.
La classe rappresenta un insieme ordinato i cui elementi sono
semplici alberi binari di ricerca (classe BST<E>).
Ogni albero binario di ricerca dell'insieme č rappresentato
dal suo elemento pių grande. L'insieme conterrā al massimo
100 elementi. Gli elementi dell'insieme dovranno essere
ordinati in base al loro rappresentante.
L'implementazione del metodo iterator() č facoltativo, cosė
come la gestione delle eccezioni all'interno delle classi (Se
il metodo iterator() non viene implementato il corpo dovrā
contenere solo l'istruzione “return null”).
Realizzare in seguito, mediante il metodo main() della
classe, un programma Java che prenda in input un file di
testo contenente le specifiche di alcuni alberi binari di
ricerca (contenenti valori interi) e restituisca in output un
file di testo contenente alcune caratteristiche dell'insieme
dopo aver applicato 5 operazioni extractMax().

Il file di input contiene una serie di righe terminanti con
una carattere punto e virgola “;”. Ciascuna riga contiene la
sequenza dei valori interi da inserire in ciascun albero
dell'insieme. I valori interi sono forniti in ordine di
inserimento nell'albero.
File di output
La prima riga del file di output contiene due valori interi
separati da uno spazio. Il primo valore rappresenta il numero
di valori interi dell'insieme, mentre il secondo valore
rappresenta il numero di alberi. La seconda riga del file
contiene l'elemento (Integer) pių grande dell'insieme.
Ora, riporto il codice, vorrei che qualcuno mi chiarisse come evitare i problemi con l'interfaccia Comparable.
Nella classe BST<E> nel metodo addNodo(...) ho problemi la prima volta che uso il compareTo perchč non viene trovato. Ho provato a modificare qualcosa ma non va bene, potreste dirmi cosa fare per fare implementare correttamente la Comparable?

Riporto il codice e il relativo errore:

codice:
import java.util.*;
interface BSTSet270710<E> /*extends Iterable<BST<E>>*/{
public int items ();
// ritorna il numero di items (di tipo E) dell'insieme
public int size ();
// ritorna il numero di elementi (di tipo BST<E>) dell'insieme
public E getMax (int i);
// ritorna il rappresentante dell'albero di posizione i
public BST<E> getBST (int i);
// ritorna l'albero di posizione i
public void add (BST<E> tree);
// aggiunge un nuovo albero all'insieme
public void addItem (E item, int i);
// aggiunge un nuovo item all'albero di posizione i
public BST<E> search(E item);
// ritorna il primo albero dell'insieme contenente l'item E
public Iterator<BST<E>> iterator();
// ritorna un iteratore di tutti gli alberi dell'insieme
public E extractMax();
// elimina e ritorna l'item pių grande dell'insieme
}

class BSTNode<E>
{
	private E element;
	private BSTNode<E> left;
	private BSTNode<E> right;
	private BSTNode<E> parent;
	
	public BSTNode(E element)
	{
		this.element=element;
		left=null;
		right=null;
		parent=null;
	}
	
	public void setParent(BSTNode<E> parent){this.parent=parent;}
	public BSTNode<E> getParent(){return parent;}
	public E getElement(){return element;}
	public BSTNode<E> getLeft(){return left;}
	public void setLeft(BSTNode<E> left){this.left=left;}
	public BSTNode<E> getRight(){return right;}
	public void setRight(BSTNode<E> right){this.right=right;}
	public boolean hasLeft(){return left!=null;}
	public boolean hasRight(){return right!=null;}
}

class BST<E>
{
	private BSTNode<E> root;
	private int nodes;
	private final int CAPACITY;
	
	public BST(int CAPACITY)
	{
		this.CAPACITY=CAPACITY;
		root=null;
		nodes=0;
	}
	
	public BSTNode<E> getRoot(){return root;}
	public void setRoot(BSTNode<E> root){this.root=root;}
	public int nodes(){return nodes;}
	
	public void addNodo(BSTNode<E> nodo)
	{
		if(nodes==0)
			setRoot(nodo);
		
		else if(nodes<CAPACITY){
			boolean inserito=false;
			
			BSTNode<E> tmp=getRoot();
			
			while(!inserito){
				if(tmp.getElement().compareTo(nodo.getElement())<0)
				{
					if(!(tmp.hasRight())){
						tmp.setRight(nodo);
						inserito=true;
					}
					else tmp=tmp.getRight();
				}
				
			
				else if(tmp.getElement().compareTo(nodo.getElement())>0)
				{
					if(!(tmp.hasLeft())){
						tmp.setLeft(nodo);
						inserito=true;
					}
					else tmp=tmp.getLeft();
				}
			}
					
			}
		nodes++;
	}
	
	public E getMax(){
		if(getRoot()==null) return null;
		
		BSTNode<E> tmp=getRoot();
		
		while(tmp.hasRight())
			tmp=tmp.getRight();
		
		return (E)tmp;
	}
	
	
	public E remove()
	{
		if(size==0) return null;
		
		else{
			BSTNode<E> remove=getMax();
			if(!(remove.hasRight()) && !(remove.hasLeft()))
			{
				remove.getParent().setRight(null);
				remove.setParent(null);
				nodes--;
				return (E)remove;
			}
			
			else{
				remove.getLeft().setParent(remove.getParent());
				remove.getParent().setRight(remove.getLeft());
				remove.setLeft(null);
				nodes--;
				return (E)remove;
				}
			}
	}
	
	public boolean find(E label)
	{
		boolean trovato=false;
		BSTNode<E> tmp=getRoot();
		while(tmp!=null){
			
			if(tmp.getElement().compareTo(label)>0)
				tmp=tmp.getLeft();
			else if(tmp.getElement().compareTo(label)<0)
				tmp=tmp.getRight();
			
			else trovato=true;
		}
		
		return trovato;
	}
}

class Node<E>
{
	private E element;
	private Node<E> next;
	
	public Node(E element)
	{
		this.element=element;
		next=null;
	}
	
	public E getElement(){return element;}
	public Node<E> getNext(){return next;}
	public void setNext(Node<E> next){this.next=next;}
}

class Insieme<E> implements BSTSet270710<E>
{
	private Node<E> head;
	private int items;
	private int size;
	
	public Insieme()
	{
		head=null;
		items=0;
		size=0;
	}
	
	
	public Node<E> getHead(){return head;}
	public int items(){return items;}
	public int size(){return size;}
	
	public E getMax(int i)
	{
		if(size==0) return null;
		int j=0;
		Node<E> tmp=getHead();
		
		while(j!=i && tmp!=null)
		{
			tmp=tmp.getNext();
			j++;
		}
		
		E element=((BST)tmp.getElement()).getMax();
	    return element;
	}
	
	public BST<E> getBST (int i)
	{
		if(size==0) return null;
		int j=0;
		Node<E> tmp=getHead();
		
		while(j!=i && tmp!=null)
		{
			tmp=tmp.getNext();
			j++;
		}
		
		return tmp.getElement();
	}
	
	public void add (BST<E> tree){
		if(size==0)
			head.setElement(tree);
		
		Node<E> nuovo=new Node(tree);
		Node<E> tmp=head;
		Node<E> prev=head;
		boolean inserito=false;
		E max=tree.getMax();
		
	    while(tmp.getNext()!=null && !inserito){
	
			if(tmp.getElement().getMax().compareTo(max)>0)
			{
				if(tmp==head)
				{
					nuovo.setNext(head);
					head=nuovo;
					inserito=true;
				}
				else{
					prev.setNext(nuovo);
					nuovo.setNext(tmp);
					inserito=true;
				       }
			}
			prev=tmp;
			tmp=tmp.getNext();
		}
			
			if(inserito!=true)
				tmp.setNext(nuovo);
		size++;
	}
	
	public void addItem (E item, int i)
	{
		if(size==0) return;
		
		int j=0; 
		Node<E> tmp=head;
		
		while(j!=i && tmp!=null){
			j++;
			tmp=tmp.getNext();
		}
		
		tmp.getElement().addNodo(new BSTNode(item));
	}
	
	
	public BST<E> search(E item)
	{
		if(head==null) return null;
		
		boolean trovato=false;
		Node<E> tmp=head.getElement();
		BST<E> albero;
		
		while(tmp!=null && !trovato)
		{
			albero=tmp.getElement();
			trovato=albero.find(item);
		}
		
		return albero;
	}
	
	public Iterator<BST<E>> iterator(){return null;}
	
	public E extractMax(){
		Node<E> tmp=head;
		
		while(tmp.getNext()!=null)
			tmp=tmp.getNext();
		E max=tmp.getElement().getMax();
		
	   return max;
	}
}

public class SS7_003292
{
	public static void main(String [] args)
	{
		Costruiscialbero("input.txt", "output.txt");
	}
	
	public void Costruiscialbero(String input, String output)
	{
		Scanner s=null;
		FileReader reader=null;
		//BufferedReader buff=null;
		PrintWriter out=null;
		
		try{
			reader=new FileReader("input.txt");
			out=new PrintWriter("output.txt");
			s=new Scanner(new File(reader));
			BST<BSTNode> albero=new BST(100);
			Insieme<BST> insieme=new Insieme();
			insieme.add(albero);
			int k=0;
			
			while(s.hasNext())
			{
				if(s.next().equals(" "))
				{
					String value=s.next();
					if(!(value.equals(";")))
					{
						insieme.addItem(value, k);
						
					}
				
					else	if(s.next().equals(";")){
					BST<BSTNode> albero=new BST(100);
						insieme.add(albero);
						k++;
					}
				}
			}
			
			int index=0;
			
			while(index<5)
			{
				insieme.extractMax();
				index++;
			}
			
			out.print(insieme.items()+" "+insieme.insieme.size()+"\r\n");
			out.print(out.print(insieme.extractMax()));
		      }
		      
		      catch(FileNotFoundException e1)
		      {
			      System.out.println("Error...file not found");
		      }
		      
		      catch(IOException e2)
		      {
			      System.out.println("Error...file not found");
		      }
		      
		      finally{
				   try{
					   reader.close();
					   out.close();
					}
					
					catch(IOException e3)
					{
						System.out.println("Error...it is not possible to close files");
					}
				}
	}
}
Errore:
codice:
cannot find symbol
symbol  : method compareTo(E)
location: class java.lang.Object
				if(tmp.getElement().compareTo(nodo.getElement())<0)
Spero mi chiariate le cose, ne ho davvero bisogno, grazie.