😀前言
在二叉树的遍历问题中,从上往下、从左到右打印出二叉树的每个节点值是一种常见的题目类型。这种遍历方式与广度优先搜索(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),我们能够有效地从上到下、从左到右打印出二叉树的所有节点值,并将其存储在一个数组中返回。这种方法不仅直观易懂,而且能够满足题目对时间和空间复杂度的要求,是处理二叉树层序遍历的经典解法。
😁热门专栏推荐
想学习vue的可以看看这个
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞