从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
层次遍历
题解
层次遍历首先应该想到的就是借助队列来实现。
为什么需要用Queue来解决层序遍历?
Queue特点:先进先出
tree特点:获取的上一层,才能得到下一层
解决方案:从queue中出来一个Node,就把其左右孩子,加入Queue
- 需要借助两种数据结构 Queue(用 LinkedList 来实现)和List(用 ArrayList 来实现)
- Queue的作用是根据出队列的节点,通过判空之后,将左右孩子入队列
- List的作用是将 出队列的节点的值 进行保存
- 注意将List转换成数组
剑指 Offer 32 - I. 从上到下打印二叉树
class Solution {
// 利用 queue 的特性来进行层序遍历
Queue<TreeNode> queue = new LinkedList<>();
// 利用 list 来用于保存遍历的数据
List<Integer> list = new ArrayList<>();
public int[] levelOrder(TreeNode root) {
int[] res = new int[0];
if(root==null){
return res;
}
// 核心方案:queue中取出一个元素,再把其左右孩子加入 queue
queue.add(root);
while (!queue.isEmpty()){
TreeNode node = queue.remove();
list.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
// 把 ArrayList 类型转换为 int[] 数组
res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
题解
每层都放入一个 List,通过for循环queue.size()来分辨每一层
class Solution {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> ret = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null){
return ret;
}
queue.add(root);
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode node = queue.remove();
list.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
ret.add(list);
}
return ret;
}
}
题解
需要引入一个标记位 flag 表示当前插入的尾插还是头插(需要将插入下标设置为0)
Z型,通过 list 中的尾部追加 -> 头部插入
class Solution {
List<List<Integer>> ret = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null){
return ret;
}
queue.add(root);
Boolean flag = true;
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode node = queue.remove();
if(flag){
list.add(node.val); //奇数行,list尾插追加
}else{
list.add(0,node.val);// 偶数行,list中头部插入
}
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
flag = !flag;
ret.add(list);
}
return ret;
}
}