1、题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2、算法思想以及知识点补充
算法思想:
① 二叉树遍历每一层,把每一层的结点存储到队列中
② 然后对每一层的结点进行遍历
③ 每一层的遍历的结果添加到建好的集合中
④ 最后将把每层的元素添加到大集合中
Queue 中 add() 和 offer()都是用来向队列添加一个元素。
在容量已满的情况下,add() 方法会抛出IllegalStateException异常,offer() 方法只会返回 false 。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
3、算法图解
注意:获取二叉树中的值的方式:
TreeNode node = new TreeNode();
node.val;
4、代码实现
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/*
队列中添加元素可以用add,offer,在栈容量已经满的情况下,add()会抛出IllegalStateException异常
offer()方法只会返回false
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
//定义一个集合序列,泛型是ArrayList集合
//关于泛型是Integer,因为每一层输出的是[[8],[6,10],[5,7,9,11]]
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
// 判断根结点是否为空,为空的话返回list
if(pRoot == null){
return list;
}
// 定义一个队列存储二叉树中的元素,LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue<TreeNode> queue = new LinkedList<TreeNode>();
// 向队列中添加二叉树根节点
queue.offer(pRoot);
while(!queue.isEmpty()){
// 定义一个集合接收每层的二叉树元素
ArrayList<Integer> arr = new ArrayList<Integer>();
//获取队列的长度
int size = queue.size();
// 对队列进行遍历
for(int i = 0;i < size;i++){
// 队列中有元素,出栈队列中的元素
TreeNode temp = queue.poll();
// 将出栈的元素放到集合中
arr.add(temp.val);
//将左右孩子入队
if(temp.left != null){
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
}
list.add(arr);
}
return list;
}
}
扫描二维码关注公众号,回复:
13130453 查看本文章