题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思想
二叉树打印,队列思想
1、新建当前所在层节点的队列queue,根节点入队列
2、如果队列queue不为空
2.1新建缓冲队列buff,存放当前节点的孩子节点
新建集合al,存放当前层的节点
2.2 如果队列queue不为空,
- poll出栈顶元素即为cur,将当前元素值加入集合al
2.2.1 若cur的左孩子不为空,将左孩子加入缓冲队列buff
2.2.2 若cur的右孩子不为空,将右孩子加入缓冲队列buff
2.3 否则当前队列queue为空,说明当前层节点遍历完,则将al加入res,
并将buff赋值给queue,成为父节点继续循环
3、返回res
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
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)
{
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null)
return result;
Queue<TreeNode> queue = new LinkedList<>();//当前所在层的节点的队列
queue.offer(pRoot);
while (!queue.isEmpty()) //遍历每一层
{
Queue<TreeNode> buff = new LinkedList<>();//新建缓冲队列:当前节点的孩子节点的队列
ArrayList<Integer> al = new ArrayList<>();//新建集合al,存放当前层节点
while (!queue.isEmpty()) //遍历当前层
{
TreeNode cur = queue.poll();
al.add(cur.val);
if (cur.left != null)
buff.offer(cur.left);
if (cur.right != null)
buff.offer(cur.right);
}
result.add(al);
queue = buff;//转向遍历下一层
}
return result;
}
/* ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) return result;
int curRow=1;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
while (!queue.isEmpty()) {
int nextRow=0;
ArrayList<Integer> al = new ArrayList<>();
for (int i = 0; i < curRow; i++) {
TreeNode cur = queue.poll();
al.add(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
nextRow++;
}
if (cur.right != null) {
queue.offer(cur.right);
nextRow++;
}
}
result.add(al);
curRow = nextRow;
}
return result;
}*/
}