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


京公网安备 11010502036488号