摘要
剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
一、二叉树的层序遍历
题目要求的二叉树的从上至下打印(即按层打印),又称为二叉树的广度优先搜索(BFS)。BFS通常借助队列的先入先出特性来实现。
算法流程:
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至列表 tmp 尾部;
- 添加子节点: 若 node的左(右)子节点不为空,则将左(右)子节点加入队列queue ;
- 返回值: 返回打印结果列表 res 即可。
package Tree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
* @Classname JZ32从上到下打印二叉树I
* @Description TODO
* @Date 2023/2/21 20:51
* @Created by xjl
*/
public class JZ32从上到下打印二叉树I {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public int[] levelOrder(TreeNode root) {
if (root == null) {
return new int[0];
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
ArrayList<Integer> ans = new ArrayList<>();
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
ans.add(node.val);
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
int[] res = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
res[i] = ans.get(i);
}
return res;
}
}
复杂度分析:
- 时间复杂度O(N) : N为二叉树的节点数量,即BFS 需循环N 次。
- 空间复杂度O(N) : 最差情况下,即当树为平衡二叉树时,最多有N/2个树节点同时queue 中,使用 O(N)大小的额外空间。
二、层序遍历的多数组
package Tree;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* @Classname JZ32层序遍历II
* @Description TODO
* @Date 2023/2/21 20:56
* @Created by xjl
*/
public class JZ32层序遍历II {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> level = new ArrayList<Integer>();
int currentLevelSize = queue.size();
for (int i = 1; i <= currentLevelSize; ++i) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
result.add(level);
}
return result;
}
}
三、之字打印(层序遍历)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists=new ArrayList<>();
if (root==null){
return lists;
}
Queue<TreeNode> queue=new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()){
int n=queue.size();
List<Integer> list=new ArrayList<>();
for (int i=1;i<=n;i++){
TreeNode node=queue.poll();
list.add(node.val);
if (node.left!=null){
queue.add(node.left);
}
if (node.right!=null){
queue.add(node.right);
}
}
lists.add(list);
}
for (int i=0;i<lists.size();i++){
if (i%2!=0){
Collections.reverse(lists.get(i));
}
}
return lists;
}
}
博文参考
《leetcode》