public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
        if (root == null) return list;

        queue.add(root);
        ArrayList<Integer> index = new ArrayList<Integer>();
        index.add(0);
        int prevN = 0;
        ArrayList<Integer> ints = new ArrayList<Integer>();
        while (queue != null && queue.size() > 0) {
            int n = index.get(0);
            index.remove(0);
            TreeNode t = queue.get(0);
            queue.remove(0);
            
            if (prevN != n) {
                list.add(ints);
                ints = new ArrayList<Integer>();
                ints.add(t.val);
            } else {
                ints.add(t.val);
            }
            
            prevN = n;
            
            if (t.left != null) {
                queue.add(t.left);
                index.add(n+1);
            }
            if (t.right != null) {
                queue.add(t.right);
                index.add(n+1);
            }
            
        }
        
        list.add(ints);
        
        return list;   
    }