1、题目描述
【JZ22】从上往下打印出二叉树的每个节点,同层节点从左至右打印。
知识点:二叉树,队列,树的层次遍历
难度:☆
2、解题思路
本题是经典的层次遍历二叉树题型,使用 BFS 的解法。
首先定义一个队列 queue,把根节点入队。
当 queue 不为空,循环以下操作:
1、取出 queue 的一个元素 node;
2、获取 node 的值;
3、如果 node 的左子节点存在,则左子节点入队;
4、如果 node 的右子节点存在,则右子节点入队。
可见,每一层的结点处理完毕后,此时的 queue 保存的元素刚好是下一层的 node。
3、解题代码
package pers.klb.jzoffer.hard;
import pers.klb.jzoffer.simple.TreeNode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
* @program: JzOffer2021
* @description: 从上往下打印二叉树
* @author: Meumax
* @create: 2020-08-12 15:53
**/
public class FromTopToBottom {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
if (root == null) return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
return list;
}
}
时间复杂度:O(n),二叉树的每个节点遍历一次
空间复杂度:O(n),二叉树的每个节点入队列一次
4、解题心得
本题是二叉树 BFS 的模板题型,必须掌握。