给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// ....
}
}
二插树的层序遍历,就是每一层,每一层的输出即可,在叙述这个题之前,我们先尝试输出一下二叉树的层序遍历结果,代码如下:
class Solution{
public void printTreeNode(TreeNode root){
if(root == null) return list;
// 定义一个队列,用来存放结点
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode tmp = queue.poll();
// 输出结点
System.out.println(tmp.val);
// 左孩子不为空,入队列
if(tmp.left != null){
queue.offer(tmp.left);
}
// 右孩子不为空,入队列
if(tmp.right != null){
queue.offer(tmp.right);
}
}
}
}
根据上述代码,我们就可以很快的写出上面那个题的代码,只要我们在while循环里面,利用一个for循环,用来控制每层的结点入集合即可,代码如下:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root == null) return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
// 用来记录每层结点的个数
int sz = queue.size();
// 用来记录每层结点
List<Integer> ll = new ArrayList<>();
for(int i = 0;i < sz;i++){
TreeNode tmp = queue.poll();
ll.add(tmp.val);
if(tmp.left != null){
queue.offer(tmp.left);
}
if(tmp.right != null){
queue.offer(tmp.right);
}
}
list.add(ll);
}
return list;
}
}