public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        dfs(res, root, 1);
        return res;
    }
    
    private void dfs(List<List<Integer>> res, TreeNode node, int level) {
        if (node == null)
            return;
        if (res.size() < level)
            res.add(new ArrayList<Integer>());
        res.get(level - 1).add(node.val);
        dfs(res, node.left, level + 1);
        dfs(res, node.right, level + 1);
    }
}