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

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

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

🥰从上往下打印二叉树

NowCoder

😊题目描述

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

示例

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

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

image.png

数据范围

  • 节点总数 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),我们能够有效地从上到下、从左到右打印出二叉树的所有节点值,并将其存储在一个数组中返回。这种方法不仅直观易懂,而且能够满足题目对时间和空间复杂度的要求,是处理二叉树层序遍历的经典解法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。