算法的学习笔记—从上往下打印二叉树(牛客JZ32)
【摘要】 在二叉树的遍历问题中,从上往下、从左到右打印出二叉树的每个节点值是一种常见的题目类型。这种遍历方式与广度优先搜索(BFS)密切相关,常常用于需要层次遍历(Level-order Traversal)的场景。本文将通过具体的代码示例详细解析如何解答这道题目。
😀前言
在二叉树的遍历问题中,从上往下、从左到右打印出二叉树的每个节点值是一种常见的题目类型。这种遍历方式与广度优先搜索(BFS)密切相关,常常用于需要层次遍历(Level-order Traversal)的场景。本文将通过具体的代码示例详细解析如何解答这道题目。
🥰从上往下打印二叉树
😊题目描述
给定一棵二叉树,要求不分行地从上到下打印出二叉树的每个节点值,打印顺序为同一层从左到右。最终将打印结果存放到一个数组中并返回。
示例
以二叉树 {8,6,10,#,#,2,1}
为例,它的层次遍历结果如下
输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]
数据范围
- 节点总数
0 ≤ 节点总数 ≤ 1000
- 节点值范围
-1000 ≤ 节点值 ≤ 1000
😀示例
示例1
输入:{8,6,10,#,#,2,1}
返回值:[8,6,10,2,1]
示例2
输入:{5,4,#,3,#,2,#,1}
返回值:[5,4,3,2,1]
🤔解题思路
要实现这种从上往下的遍历方式,最常用的方法是广度优先搜索(BFS),即使用队列逐层遍历二叉树的节点,并依次将节点值存入数组。
具体步骤如下:
-
初始化队列:使用一个队列来存放将要遍历的节点,初始时将二叉树的根节点加入队列。
-
逐层遍历
:队列不为空时,循环进行如下操作:
- 获取当前层的节点数,即队列的长度。
- 逐一将当前层的节点出队,将它们的值存入结果数组中。
- 将当前节点的左右子节点(如果有)依次加入队列,以备下一次遍历。
-
跳过空节点:如果当前节点为空,直接跳过,不加入结果数组,也不加入队列。
-
返回结果:当队列为空时,表示树的所有节点已遍历完毕,返回结果数组。
😘代码实现
下面是基于 Java 实现的代码示例:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
// 用于存储最终结果的列表
ArrayList<Integer> ret = new ArrayList<>();
// 使用队列实现层次遍历
Queue<TreeNode> queue = new LinkedList<>();
// 将根节点加入队列
queue.add(root);
// 当队列不为空时,继续遍历
while (!queue.isEmpty()) {
// 当前层的节点数量
int cnt = queue.size();
// 遍历当前层的所有节点
while (cnt-- > 0) {
// 从队列中取出当前节点
TreeNode t = queue.poll();
// 如果节点为空,则跳过
if (t == null)
continue;
// 将节点值加入结果列表
ret.add(t.val);
// 将节点的左子节点加入队列
queue.add(t.left);
// 将节点的右子节点加入队列
queue.add(t.right);
}
}
// 返回最终结果
return ret;
}
}
详细解析
- 初始化与根节点处理:
Queue<TreeNode> queue = new LinkedList<>();
:初始化一个队列,用于存放将要处理的节点。queue.add(root);
:将根节点加入队列,如果树为空,队列中将包含null
。
- 遍历与节点处理:
while (!queue.isEmpty())
:循环遍历队列,直到所有节点都被处理完。int cnt = queue.size();
:记录当前层的节点数量,这样可以确保每次内层循环只处理当前层的节点。TreeNode t = queue.poll();
:从队列中取出一个节点进行处理。if (t == null) continue;
:如果节点为空,则跳过此次循环,继续处理下一个节点。ret.add(t.val);
:将当前节点的值添加到结果列表中。queue.add(t.left);
和queue.add(t.right);
:将当前节点的左右子节点依次加入队列,供后续层次遍历。
- 结果返回:
return ret;
:最终返回包含所有节点值的列表。
😄总结
通过使用广度优先搜索(BFS),我们能够有效地从上到下、从左到右打印出二叉树的所有节点值,并将其存储在一个数组中返回。这种方法不仅直观易懂,而且能够满足题目对时间和空间复杂度的要求,是处理二叉树层序遍历的经典解法。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)