题目描述:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
解题思路:
和题型1思路差不多,使用队列先进先出的处理每个节点,但是要注意每一层都是一个列表,所以要记录好下一层的节点数有多少,例如第一行的是root,队列的大小就是1,处理完root之后,列表里面的节点就之后第二层的节点了,因为root已经被移出去了,这是计算队列的大小,这个数就是第二层的节点数,以这个节点数为循环次数,每处理一个节点,移除一个节点,以此类推。
代码(Java):
import java.util.*;
public class questiontwo {
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right.left = new TreeNode(9);
root.right.right = new TreeNode(11);
List<List<Integer>> res = new ArrayList<>();
res = levelOrder(root);
for(int i = 0;i<res.size();i++){
System.out.println(res.get(i));
}
}
public static List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> res = new ArrayList<>();
if(root == null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root); //把根节点放进队列,开始程序
while(!queue.isEmpty()){ //如果队列不是空的,说明二叉树不会遍历完,如果有下一层,会在当前这层往队列里加入下一层的节点
int size = queue.size(); //首先得到当前要这一层要处理的节点数
List<Integer> curlevel = new ArrayList<>(); //初始化用来放当前这层节点的值的容器
while(--size >= 0){ //按照要处理节点的个数来处理
TreeNode cur = queue.remove(); //每处理一个节点,就把一个节点移出队列
// System.out.println(cur.val);
curlevel.add(cur.val); //同时把要处理节点的值放进当前层的容器中
if(cur.left != null) queue.add(cur.left); //如果当前节点有左右子节点,就加入到队列中
if(cur.right != null) queue.add(cur.right);
}
// System.out.println(curlevel);
res.add(curlevel);
}
return res;
}
}