给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

分析:这道题不同于普通的层次遍历,普通层次遍历只需要定义一个队列(Qeue)即可,然后依次将各个层的节点添加,遍历,而这道题需要把每层的节点分开储存,然后添加到总的list列表中,这就需要,额外添加一个队列,用来储存下一层的节点,区分本层节点,当本层节点遍历完成后,就可以将遍历结果添加到总的list列表中,然后再遍历下一层,实现代码如下

 

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

// leetcode:二叉树的层次遍历
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 作为返回结果
        List<List<Integer>> res = new LinkedList<>();
        // 如果根节点为null,则直接返回
        if (root == null) {
            return res;
        }
        // 声明每层的list集合为layer
        List<Integer> layer = new LinkedList<>();

        // 定义队列queue记录当前层的树节点
        Queue<TreeNode> queue = new LinkedList<>();
        // 定义队列nextQueue记录下一层的树节点
        Queue<TreeNode> nextQueue = new LinkedList<>();

        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.remove();
            layer.add(node.val);

            // 将本层的父子节点都添加到下一层的queue中,用于下一层的遍历
            if(node.left != null) {
                nextQueue.add(node.left);
            }
            if(node.right != null) {
                nextQueue.add(node.right);
            }

            //本层遍历结束
            if(queue.isEmpty()) {
                Queue<TreeNode> temp = new LinkedList<>();
                // 此时queue大小已经为0,所以temp也为null
                temp = queue;
                // 即将遍历下一层
                queue = nextQueue;
                // 将nextQueue大小置为0
                nextQueue = temp;

                // 将本层的遍历结果layer添加到总list集合res中
                res.add(layer);
                layer = new LinkedList<>();
            }
        }
        return res;
    }
}