从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
这里我们需要用到一个数据结构,那就是队列。
核心思想:每次出队一个元素,就将该元素的孩子节点加入队列中,直至队列中元素个数为0时,出队的顺序就是该二叉树的层次遍历结果。
初始状态下,队列中只保留根节点的元素:
当A出队时,将A的孩子节点加入队列中:
重复上面的动作,队首元素出队时,将孩子节点加入队尾…
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
Queue<TreeNode> que = new LinkedList<>();//建立队列
ArrayList<ArrayList<Integer>> mylist = new ArrayList<>();//建立包含集合的集合
if(pRoot == null)return mylist;
que.offer(pRoot);//将根结点放入队列
while(!que.isEmpty()){
ArrayList<Integer> list = new ArrayList<>();//新建一个存储每层元素的集合
int size = que.size();//这里需要特意单独定义一个size而不是放在for(i<que.size),
//因为size是根据每层元素个数重新赋值的。
for(int i=0;i<size;i++){
TreeNode temp = que.poll();//新建一个结点用来代表出队的结点
list.add(temp.val);//将出队结点值放入集合
if(temp.left!=null)que.offer(temp.left);//若有左结点则将结点放入队中
if(temp.right!=null)que.offer(temp.right);//若有右结点则将结点放入队中
}
mylist.add(list);//将存储该层元素的集合放入大集合中,用来区分层与层。
}
return mylist;
}
}