1.题目描述
给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。
例如:
给定的二叉树是{1,2,3,#,#,4,5}
2.算法分析
知识补充:Queue,offer入队,poll出队,两个方法。
二叉树的层次遍历:
2个容器:一个容器存储二叉树结点,另一个容器存储的是二叉树结点的值。
使用while(!queue。isEmpty()),作为条件。
下面对容器进行分析:
ArrayList;Queue先进先出。可以替换。知识ArrayList使用的是remove方法。remove(int index)方法删除指定位置的元素并返回。
具体代码注释详细:
3.代码实现
①使用Queue
import java.util.*; /* 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<ArrayList<Integer>>(); if(pRoot == null){ return result; } // 定义队列存储的是TreeNode Queue<TreeNode> queue = new LinkedList<>(); // 入队 queue.offer(pRoot); // 存储二叉树每一层的结点 while(!queue.isEmpty()){ // 每一层的结点要单独存放 ArrayList<Integer> list = new ArrayList<>(); // 这一步骤非常重要,queue不能写在for循环条件里面。 int size = queue.size(); // 对每一层进行遍历 for(int i=0;i< size;i++){ TreeNode temp = queue.poll(); list.add(temp.val); if(temp.left != null){ queue.offer(temp.left); } if(temp.right != null){ queue.offer(temp.right); } } result.add(list); } return result; } }
②使用ArrayList
import java.util.*;
/*
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<ArrayList<Integer>>();
if(pRoot == null){
return result;
}
// 定义队列存储的是TreeNode
ArrayList<TreeNode> queue = new ArrayList<>();
// 入队
queue.add(pRoot);
// 存储二叉树每一层的结点
while(!queue.isEmpty()){
// 每一层的结点要单独存放
ArrayList<Integer> list = new ArrayList<>();
// 这一步骤非常重要,queue不能写在for循环条件里面。
int size = queue.size();
// 对每一层进行遍历
for(int i=0;i< size;i++){
TreeNode temp = queue.remove(0);
list.add(temp.val);
if(temp.left != null){
queue.add(temp.left);
}
if(temp.right != null){
queue.add(temp.right);
}
}
result.add(list);
}
return result;
}
}