public class ArrayListTree<E> implements BinTree<E> {
    
    private java.util.List<E> data = new java.util.ArrayList<E>();
    
    public boolean isEmpty() {  return this.data.get(0) == null;  }
    
    public int size() {
        int counter = 0;
        for (int i = 0; i < this.data.size(); i++) {
            if (this.data.get(i) != null) {  counter++;  }
        }
        return counter;
    }
    
    public int height() {  return height(0);  }
    private int height(int index) {
        if (this.data.get(index) == null) {  return -1;  }
        return 1 + max(height(2*index+1), height(2*index+2));
    }
    private static int max(int a, int b) {  return a > b ? a : b;  }

    public java.util.List<E> preOrder() {
        return preOrder(0, new java.util.ArrayList<E>());
    }
    private java.util.List<E> preOrder(int index, java.util.List<E> res) {
        E elem = this.data.get(index);
        if (elem != null) {
            res.add(elem);
            preOrder(2*index+1, res);
            preOrder(2*index+2, res);
        }
        return res;
    }

    public java.util.List<E> inOrder() {
        return inOrder(0, new java.util.ArrayList<E>());
    }
    private java.util.List<E> inOrder(int index, java.util.List<E> res) {
        E elem = this.data.get(index);
        if (elem != null) {
            inOrder(2*index+1, res);
            res.add(elem);
            inOrder(2*index+2, res);
        }
        return res;
    }

    public java.util.List<E> postOrder() {
        return postOrder(0, new java.util.ArrayList<E>());
    }
    private java.util.List<E> postOrder(int index, java.util.List<E> res) {
        E elem = this.data.get(index);
        if (elem != null) {
            postOrder(2*index+1, res);
            postOrder(2*index+2, res);
            res.add(elem);
        }
        return res;
    }

    public static void main(String[] args) {
        ArrayListTree<Character> tree = new ArrayListTree<Character>();
        tree.data = java.util.Arrays.asList(new Character[] {'D','B','I','A','C','E',null,null,null,null,null,null,'G',null,null,null,null,null,null,null,null,null,null,null,null,'F','H',null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null});
        System.out.println(tree.preOrder());
        System.out.println(tree.inOrder());
        System.out.println(tree.postOrder());
    }
}
