算法的学习笔记—从上往下打印二叉树(牛客JZ32)

#开发团队如何应对突发的技术故障和危机?#

img

😀前言
在二叉树的遍历问题中,从上往下、从左到右打印出二叉树的每个节点值是一种常见的题目类型。这种遍历方式与广度优先搜索(BFS)密切相关,常常用于需要层次遍历(Level-order Traversal)的场景。本文将通过具体的代码示例详细解析如何解答这道题目。

🏠个人主页:尘觉主页

🥰从上往下打印二叉树

NowCoder

😊题目描述

给定一棵二叉树,要求不分行地从上到下打印出二叉树的每个节点值,打印顺序为同一层从左到右。最终将打印结果存放到一个数组中并返回。

示例

以二叉树 {8,6,10,#,#,2,1} 为例,它的层次遍历结果如下

输入:{8,6,10,#,#,2,1} 
返回值:[8,6,10,2,1]

img

数据范围

  • 节点总数 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),即使用队列逐层遍历二叉树的节点,并依次将节点值存入数组。

具体步骤如下:

  1. 初始化队列:使用一个队列来存放将要遍历的节点,初始时将二叉树的根节点加入队列。

  2. 逐层遍历

    :队列不为空时,循环进行如下操作:

    • 获取当前层的节点数,即队列的长度。
    • 逐一将当前层的节点出队,将它们的值存入结果数组中。
    • 将当前节点的左右子节点(如果有)依次加入队列,以备下一次遍历。
  3. 跳过空节点:如果当前节点为空,直接跳过,不加入结果数组,也不加入队列。

  4. 返回结果:当队列为空时,表示树的所有节点已遍历完毕,返回结果数组。

😘代码实现

下面是基于 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;
    }
}

详细解析

  1. 初始化与根节点处理
    • Queue<TreeNode> queue = new LinkedList<>();:初始化一个队列,用于存放将要处理的节点。
    • queue.add(root);:将根节点加入队列,如果树为空,队列中将包含 null
  2. 遍历与节点处理
    • 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);:将当前节点的左右子节点依次加入队列,供后续层次遍历。
  3. 结果返回
    • return ret;:最终返回包含所有节点值的列表。

😄总结

通过使用广度优先搜索(BFS),我们能够有效地从上到下、从左到右打印出二叉树的所有节点值,并将其存储在一个数组中返回。这种方法不仅直观易懂,而且能够满足题目对时间和空间复杂度的要求,是处理二叉树层序遍历的经典解法。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值