Innanzitutto invochi ricorsivamente copiadati ma non usi il valore di ritorno.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 ; }
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[].