Originariamente inviato da ste9213
codice:
  
   public int[] copiadati(){

	final int MAX = 100 ;
	int[] a = new int[MAX] ;
	int i = 0 ;

		if(left != null && right != null ||
		   left == null && right == null)
		{

				a[i] = dato ;
				i = 1 ;
		}


		if(right != null)
		{
			right.copiadati() ;
		}

		if(left != null)
		{
			left.copiadati() ;
		}
		return a ;
	}
Innanzitutto invochi ricorsivamente copiadati ma non usi il valore di ritorno.

Pensa: ad ogni livello di invocazione di copiadati hai: un dato e puoi chiedere ai left/right quello che c'è "sotto". Quanto/cosa c'è sotto i due figli ... non lo sai e infatti copiadati restituisce un int[] apposta.

Quindi o in copiadati "unisci" l'insieme di <dato> + <cosa restituisce left> + <cosa restituisce right> ottenendo un unico array che restituisci (avverrà così ad ogni livello ... è "pesante", lo so ...).

Oppure sfrutti un metodi privato che è quello che entrerebbe nel giro della invocazione ricorsiva e che potrebbe ricevere ad esempio un ArrayList<Integer>. Il copiadati "pubblico" è solo più quello di facciata che fa partire la ricorsione col metodo privato e converte da ArrayList<Integer> a int[].