算法日常・每日刷题--<队列,宽搜>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 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法