Ciao, la logica è piuttosto semplice: per ogni nodo stampi quel nodo, poi il sottoalbero sinistro, poi quello destro.
Ti posto il codice:
codice:
import java.util.ArrayList;


public class StampaAlbero {


    public static void stampaSottoalberoSx(ArrayList<Character> lista, int n) {
        if(2*n+1 < lista.size()) {
            System.out.println(lista.get(2*n+1));
            stampaSottoalberoSx(lista, 2*n+1);
            stampaSottoalberoDx(lista, 2*n+1);
        }
        else return;
    }


    public static void stampaSottoalberoDx(ArrayList<Character> lista, int n) {
        if(2*n+2 < lista.size()) {
            System.out.println(lista.get(2*n+2));
            stampaSottoalberoSx(lista, 2*n+2);
            stampaSottoalberoDx(lista, 2*n+2);
        }
        else return;
    }


    public static void stampaAlbero(ArrayList<Character> lista) {
        System.out.println(lista.get(0));
        stampaSottoalberoSx(lista, 0);
        stampaSottoalberoDx(lista, 0);
    }


    public static void main(String[] args) {
        ArrayList<Character> albero = new ArrayList<Character>();
        albero.add('f');
        albero.add('a');
        albero.add('c');
        albero.add('d');
        albero.add('b');
        albero.add('e');

        stampaAlbero(albero);
    }

}

Volendo si potrebbe rendere l'ArrayList globale anziché continuare a passarla. Vedi tu.