import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        // 解题思路:
        // 1、采用递归思想
        // 2、层序遍历也就意味着把每层的节点找到,需要找到每层的节点,就需要知道所有上层的父节点
        // 因此把所有上层父节点放在一个集合中,找子节点的时候,就通过遍历父节点的集合
        // 然后不断递归子节点集合,只到没有子节点
        if (root == null) {
            return new ArrayList<>();
        }

        ArrayList<ArrayList<TreeNode>> arrayList = new ArrayList<>();
        ArrayList<TreeNode> list = new ArrayList<>();
        arrayList.add(list);
        list.add(root);

        ceng( list, arrayList);

        ArrayList<ArrayList<Integer>> intArrayList = new ArrayList<>();
        arrayList.forEach(array-> {
            ArrayList<Integer> intList = new ArrayList<>();
            array.forEach(a->{
                intList.add(a.val);
            });

            intArrayList.add(intList);
        });

        return intArrayList;
    }

    private void ceng(ArrayList<TreeNode> list,
                      ArrayList<ArrayList<TreeNode>> arrayList) {

        ArrayList<TreeNode> subList = new ArrayList<>();

        if (list == null || list.size() == 0) {
            return ;
        }

        list.forEach(l-> {
            if (l.left != null) {
                subList.add(l.left);
            }

            if (l.right != null) {
                subList.add(l.right);
            }
        });

        if (subList.size() > 0) {
            arrayList.add(subList);
        }

        ceng(subList, arrayList);
    }
}