题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思考与上一道之字形打印二叉树的区别
这个是每一行的方向一样
先添加一层,然后把这层的节点从左到右的添加进去,只能用队列,这样下次添加的时候利用队列的先进先出原则,首先取出的时上一层最左边的节点,再依次添加,遍历队列借助Iterator。
刚开始利用栈,顺序弄不到,这一道与上一道很好的区别的栈和队列的区别。
之前用对列较少,
队列Queue是一个接口,表示一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用,还有优先级队列PriorityQueue也是Queue的实现类
PriorityQueue是按照队列元素的大小进行重新排序,当调用peek()或者是poll()的方法取出队列中的元素通常都是最小的元素。
- 自然排序:集合中的元素必须实现Comparable接口,而且应该是同一个类的多个实例,否则可能导致ClassCastException异常。
- 定制排序:创建队列时,传入一个Comparator对象,该对象负责对队列中的所有元素进行排序。采用定制排序时不需要元素实现Comparable接口。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
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>> res = new ArrayList<>();
if(pRoot==null){
return res;
}
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.add(pRoot);
while(!q.isEmpty()){
int cur=0;
int size=q.size();
ArrayList<Integer> value=new ArrayList<>();
Iterator<TreeNode> it=q.iterator();
while(it.hasNext()){
value.add(it.next().val);
}
res.add(value);
while(cur<size){
TreeNode node=q.poll();
if(node.left!=null)q.add(node.left);
if(node.right!=null)q.add(node.right);
cur++;
}
}
return res;
}
}