一、算法解析

需要使用的变量:

   1. last,表示当前层的最后一个节点
   2. nlast,下一层的最后一个节点
   3. treeNodeQueue,用于存放节点的队列
   4. current,指向当前遍历的节点

思路:

   初始化:last指向根节点。将根节点放入节点队列,并令nlast指向放入的节点。
   【1】移除队头元素并遍历,current = 该节点,然后将该节点的左右孩子(如果不为null)放入队列,且每放入一个,便令nlast指向它。
   【2】判断current是否等于last,若相等,说明当前层遍历完了,转至下一层。
   【3】重复【1】【2】直至节点遍历完

二、算法主体

        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();        //结果数组
        treeNodeQueue.add(root);        //初始队列中只有根节点
        while(!treeNodeQueue.isEmpty()){        //只要队列不空,说明还有节点,继续遍历
            ArrayList<Integer> currentLayerNodes = new ArrayList<Integer>();        //当前层数组

            while(true){
                //移除队头元素并遍历
                current = treeNodeQueue.remove();
                currentLayerNodes.add(current.val);

                //将队头节点的孩子放入队列中
                if(current.left != null){
                    treeNodeQueue.add(current.left);
                    nlast = current.left;
                }

                if(current.right != null){
                    treeNodeQueue.add(current.right);
                    nlast = current.right;
                }

                //若遍历到当前层末尾,则切换到下一行
                if(current == last){
                    res.add(currentLayerNodes);
                    last = nlast;
                    break;
                }
            }
        }