一、算法解析
需要使用的变量:
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; } } }