leetcode算法(515.在每个树行中找最大值)

算法思路说明:

  1. BFS层序遍历:使用队列进行广度优先搜索,按层遍历二叉树

  2. 每层最大值计算

    • 初始化每层的最大值为 INT_MIN(最小整数,包含在 <climits><limits.h> 中)

    • 遍历每层所有节点,不断更新最大值

  3. 更新最大值的技巧

cpp 复制代码
// 方法1:使用条件运算符
maxValue = node->val > maxValue ? node->val : maxValue;

// 方法2:使用max函数
maxValue = max(maxValue, node->val);
  1. INT_MIN

    • 是C/C++中的宏定义,表示最小整数值(通常是-2147483648)

    • 需要包含头文件 <climits><limits.h>

    • 如果不包含头文件,在一些编译器中使用INT_MIN可能会报错

cpp 复制代码
class Solution {
public:
    // 找出二叉树每一层中的最大值
    vector<int> largestValues(TreeNode* root) {
        // 创建队列用于BFS层序遍历
        queue<TreeNode*> que;
        
        // 如果根节点不为空,将其加入队列
        if (root != NULL) que.push(root);
        
        // 存储结果的向量,将保存每一层的最大值
        vector<int> result;
        
        // 当队列不为空时,继续遍历
        while (!que.empty()) {
            // 获取当前层的节点数量
            int size = que.size();
            
            // 初始化当前层的最大值
            // 使用INT_MIN(最小整数值)作为初始值,确保任何节点值都会比它大
            int maxValue = INT_MIN;
            
            // 遍历当前层的所有节点
            for (int i = 0; i < size; i++) {
                // 取出队首节点
                TreeNode* node = que.front();
                que.pop();
                
                // 更新当前层的最大值
                // 如果当前节点值大于maxValue,则更新maxValue
                // 这是条件运算符:condition ? expr1 : expr2
                // 当node->val > maxValue为真时,返回node->val,否则返回maxValue
                maxValue = node->val > maxValue ? node->val : maxValue;
                
                // 将当前节点的左子节点加入队列(如果存在)
                if (node->left) que.push(node->left);
                
                // 将当前节点的右子节点加入队列(如果存在)
                if (node->right) que.push(node->right);
            }
            
            // 将当前层的最大值加入结果数组
            result.push_back(maxValue);
        }
        
        // 返回每层最大值的向量
        return result;
    }
};

带头文件的完整代码,包含了输入输出

cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>
#include <climits>  // 包含INT_MIN定义

using namespace std;

// 二叉树节点定义
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) {
        // 创建队列用于BFS层序遍历
        queue<TreeNode*> que;
        
        // 如果根节点不为空,将其加入队列
        if (root != NULL) que.push(root);
        
        // 存储结果的向量,将保存每一层的最大值
        vector<int> result;
        
        // 当队列不为空时,继续遍历
        while (!que.empty()) {
            // 获取当前层的节点数量
            int size = que.size();
            
            // 初始化当前层的最大值
            // 使用INT_MIN(最小整数值)作为初始值,确保任何节点值都会比它大
            int maxValue = INT_MIN;
            
            // 遍历当前层的所有节点
            for (int i = 0; i < size; i++) {
                // 取出队首节点
                TreeNode* node = que.front();
                que.pop();
                
                // 更新当前层的最大值
                // 如果当前节点值大于maxValue,则更新maxValue
                // 这是条件运算符:condition ? expr1 : expr2
                // 当node->val > maxValue为真时,返回node->val,否则返回maxValue
                maxValue = node->val > maxValue ? node->val : maxValue;
                
                // 将当前节点的左子节点加入队列(如果存在)
                if (node->left) que.push(node->left);
                
                // 将当前节点的右子节点加入队列(如果存在)
                if (node->right) que.push(node->right);
            }
            
            // 将当前层的最大值加入结果数组
            result.push_back(maxValue);
        }
        
        // 返回每层最大值的向量
        return result;
    }
};

// 测试代码
int main() {
    // 构建测试二叉树: [1,3,2,5,3,null,9]
    //        1
    //       / \
    //      3   2
    //     / \   \
    //    5   3   9
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(3);
    root->right = new TreeNode(2);
    root->left->left = new TreeNode(5);
    root->left->right = new TreeNode(3);
    root->right->right = new TreeNode(9);
    
    Solution solution;
    vector<int> result = solution.largestValues(root);
    
    // 打印结果
    cout << "每层最大值: ";
    for (int val : result) {
        cout << val << " ";
    }
    cout << endl;
    
    // 预期输出: 1 3 9
    
    // 清理内存
    delete root->left->left;
    delete root->left->right;
    delete root->right->right;
    delete root->left;
    delete root->right;
    delete root;
    
    return 0;
}

完整代码说明:

1. 必需的头文件:

  • #include <iostream>:输入输出流,用于打印结果

  • #include <vector>:使用vector容器存储结果

  • #include <queue>:使用queue进行BFS遍历

  • #include <climits>:包含INT_MIN的定义(也可以使用<limits.h>

2. TreeNode结构体:

  • 定义了二叉树节点的基本结构

  • 包含三种构造函数:

    • 默认构造函数:val=0, left=nullptr, right=nullptr

    • 单参数构造函数:只设置val值

    • 完整构造函数:设置所有成员

3. Solution类:

  • 实现了largestValues方法

  • 使用BFS层序遍历二叉树

  • 找出每层的最大值并存储到vector中

4. main函数(测试):

  • 构建了一个测试二叉树

  • 创建Solution对象并调用largestValues方法

  • 打印结果并验证

  • 最后清理分配的内存

如果想使用std::max函数,可以包含<algorithm>头文件:

复制代码
#include <algorithm>  // 添加这个头文件可以使用max函数

// 然后修改更新最大值的代码:
maxValue = max(maxValue, node->val);  // 更简洁
相关推荐
全糖可乐气泡水2 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah3 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师3 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠4 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc
珊瑚里的鱼4 小时前
leetcode42雨水
算法·leetcode
水木流年追梦5 小时前
大模型入门-大模型的推理策略
开发语言·python·算法·正则表达式·prompt
生成论实验室5 小时前
用事件关系网络重新理解AI(三):激活函数、微调与元学习
人工智能·学习·算法·语言模型·可信计算技术
Narv工程师5 小时前
嵌入式机器人控制器算力评估:从DMIPS到WCET的完整指南
人工智能·算法·机器学习
蒟蒻的贤5 小时前
实训1227
算法
liulilittle5 小时前
TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法
linux·网络·c++·tcp/ip·算法·c·通讯