算法日常・每日刷题--<队列,宽搜>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;
    }
};
相关推荐
小此方7 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi7 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH8 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi8 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
東隅已逝,桑榆非晚11 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom11 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java66612 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐12 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮13 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers13 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法