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);  // 更简洁
相关推荐
80530单词突击赢7 分钟前
STLVector底层原理与高效运用
数据结构·算法
haluhalu.11 分钟前
LeetCode---基础算法刷题指南
数据结构·算法·leetcode
iAkuya16 分钟前
(leetcode)力扣100 58组合总和(回溯)
算法·leetcode·职场和发展
80530单词突击赢17 分钟前
C++关联容器深度解析:set/map全攻略
java·数据结构·算法
m0_5613596718 分钟前
代码热更新技术
开发语言·c++·算法
_F_y42 分钟前
链表:重排链表、合并 K 个升序链表、K 个一组翻转链表
数据结构·链表
xu_yule44 分钟前
算法基础—组合数学
c++·算法
爱尔兰极光1 小时前
LeetCode--移除元素
算法·leetcode·职场和发展
XLYcmy1 小时前
一个用于统计文本文件行数的Python实用工具脚本
开发语言·数据结构·windows·python·开发工具·数据处理·源代码
方便面不加香菜1 小时前
数据结构--链式结构二叉树
c语言·数据结构