算法日常・每日刷题--<队列,宽搜>4

LCR 044. 在每个树行中找最大值 - 力扣(LeetCode)LCR 044. 在每个树行中找最大值 - 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例 1:输入: root = 1,3,2,5,3,null,9输出: 1,3,9解释: 1 / \ 3 2 / \ \ 5 3 9 示例 2:输入: root = 1,2,3输出: 1,3解释: 1 / \ 2 3示例 3:输入: root = 1输出: 1示例 4:输入: root = 1,null,2输出: 1,2解释: 1 \ 2 示例 5:输入: root = \[\]输出: \[\] 提示: * 二叉树的节点个数的范围是 0,104 * -231 <= Node.val <= 231 - 1 注意:本题与主站 515 题相同: https://leetcode.cn/problems/find-largest-value-in-each-tree-row/ https://leetcode.cn/problems/find-largest-value-in-each-tree-row/https://leetcode.cn/problems/hPov7L/description/

一、题目分析

给定一棵二叉树根节点 root,按层遍历二叉树,收集每一层节点的最大值,最终返回存储每层最大值的数组。

二叉树层序遍历(BFS 广度优先搜索):借助队列逐层处理,每层单独遍历一遍,遍历过程维护当前层最大值,每层遍历结束后存入结果。

示例 1:二叉树分层

  • 第一层:[1] → 最大值 1
  • 第二层:[3,2] → 最大值 3
  • 第三层:[5,3,9] → 最大值 9 输出:[1,3,9]

二、算法思路详解

  1. 边界处理:根节点为空时,直接返回空数组;
  2. 队列初始化:创建队列,将根节点入队,开启层序循环;
  3. 分层循环 :每次循环先获取当前队列长度 levelSize,代表当前层节点数量
  4. 单层遍历 :循环 levelSize 次,逐个取出队首节点:
    • 对比更新当前层最大值;
    • 存在左 / 右子节点则入队,作为下一层节点;
  5. 保存结果:单层遍历完成,将该层最大值存入结果数组;
  6. 队列为空时循环结束,返回结果。
cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
vector<int> ans;
        // 空树直接返回空数组
        if(root == nullptr) return ans;

        queue<TreeNode*> q;
        q.push(root);

        while(!q.empty())
        {
            int levelSize = q.size(); // 当前层节点总数
            int maxNum = INT_MIN;     // 记录当前层最大值

            // 遍历当前整层
            for(int i = 0; i < levelSize; i++)
            {
                TreeNode* cur = q.front();
                q.pop();
                // 更新层最大值
                if(cur->val > maxNum) maxNum = cur->val;
                // 左右子节点入队
                if(cur->left) q.push(cur->left);
                if(cur->right) q.push(cur->right);
            }
            ans.push_back(maxNum);
        }
        return ans;
    }
};
相关推荐
码字的特恩1 小时前
微软确认暂不为 Windows 11 加入透明效果自定义功能,建议用户使用第三方工具
人工智能·windows·算法·microsoft·计算机·大模型·编程
星轨初途1 小时前
LeetCode 热题 100——day10 和为 K 的子数组
开发语言·c++·算法·leetcode
数模竞赛Paid answer1 小时前
2021年深圳杯数学建模C题配电网可靠性和故障软自愈研究解题全过程论文及程序
算法·数学建模·数据分析·深圳杯
有点。2 小时前
C++广度优先搜索(二)-练习题
c++·算法·宽度优先
疯狂打码的少年2 小时前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
Winner_hwx2 小时前
python拓展
算法
TAN-90°-2 小时前
Deep Learning for Computer Vision——Image Classification with Linear Classifiers
python·深度学习·算法·计算机视觉·线性回归
阿pin2 小时前
Java随笔-红黑树
java·python·算法·红黑树
Hi李耶2 小时前
【LeetCode】17.电话号码的字母组合
算法·leetcode·职场和发展