算法日常・每日刷题--<队列,宽搜>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;
    }
};
相关推荐
小欣加油2 小时前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
华华哥20222 小时前
《模型不玄学》第25章 双头模型:共享底座 + 两个分支
算法
Yfhonier2 小时前
6441. 特别的除法
c++·算法
华华哥20222 小时前
《模型不玄学》第5章 看懂你的数据:先认字段,再过门禁
算法
国科安芯2 小时前
低轨卫星姿轨控系统中抗辐射MCU的选型依据与工程实践
单片机·嵌入式硬件·算法·架构·系统安全·低轨卫星·抗辐射
高亦真2 小时前
今天是学习嵌入式的第33天
linux·学习·算法
CoderYanger2 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰2 小时前
Leecode#16刷题之最接近的三数之和
数据结构·算法
Yfhonier2 小时前
岛屿数量(DFS)
算法·深度优先
橘子汽水1682 小时前
Leetcode15:三数之和
java·数据结构·算法