分析: 1.首先(利用队列)写出二叉树的层次遍历
2.在此基础上存储每一层的元素信息
public static void levelOrder (TreeNode root) {
if(node==null) return;//空节点不做操作
Queue<TreeNode> queue = new LinkedList<TreeNode>();//创建队列
queue.offer(root);//存入根节点
while (!queue.isEmpty()) {//如果队列不空,也就是这个树没遍历完,就一直进行
node = queue.poll();//出队当前的根节点
System.out.print(node.val+ " ");//打印该节点信息
if (node.left!= null) queue.offer(node.left);//如果有左孩子,那么左孩子进队
if (node.right!= null) queue.offer(node.right);//如果有右孩子,那么右孩子进队
}
但是这样做只能是按照层次遍历的顺序输出每个节点的信息,并不能根据每个节点属于哪个层次来存储节点信息。
所以需要在此基础上增加一些操作来保存每一层次有哪些节点。
我们知道,while每执行一次,就表示这一层已经遍历完,下次执行while就是遍历下一层,
所以可以:
1.把每一轮(每一层)遍历到的节点都存储到tempList中;
2.在每一次while执行到最后一行的时候存储这层所有的信息也就是把list(临时的层次存储集合)加入到res(总结果的存储集合)中:res.add(list);
List<List<Integer>> res = new ArrayList();
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(root ==null) {
return res;
}
queue.offer(root);//当根结点不为空时,就将根结点入队列
while(!queue.isEmpty()){
List<Integer> list = new ArrayList();
int count =queue.size();//每一层元素的个数
for(int i = 0; i < count;i++){
TreeNode node = queue.poll();//弹出队首元素,并将队首元素赋值给head
list.add(node.val);//存到list
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
res.add(new ArrayList(list));
}
return res;
}