【C/C++】515. 在每个树行中找最大值

135 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第33天,点击查看活动详情


题目链接:515. 在每个树行中找最大值

题目描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

提示:

  • 二叉树的节点个数的范围是 [0,104][0,10^4]
  • 231 Node.val231 1-2^{31} \leqslant Node.val \leqslant 2^{31} - 1

示例 1:

largest_e1.jpg

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例 2:

输入: root = [1,2,3]
输出: [1,3]

整理题意

题目给定一棵二叉树的根节点 root,要求我们以数组的形式返回二叉树中每一层的最大值,如 ans[i] 表示第 i 层的最大值。

解题思路分析

遇到树形题目,通常情况是需要遍历树:

  • 该题要求我们找到给定的二叉树每一层的最大值,这里遍历每一层的思想类似于 BFS 广度优先搜索 的思想,由近到远的层序遍历,这里可以把根节点看作广度优先搜索的起点,一层一层的向外遍历,期间记录每一层的最大值即可。

  • 当然遍历也可以使用 DFS 深度优先搜索,在深度优先搜索时需要记录当前遍历到的层数,不断维护每一层的最大值即可。

具体实现

  1. 特判根节点为空时,返回空数组。
  2. 将根节点作为遍历的起点放入队列。
  3. 每次取出队列中所有元素,表示这些元素在同一层。
  4. 然后遍历这些元素,将他们的左右节点依次放入队列,作为下一层即将遍历的元素。
  5. 在遍历这些元素的时候,记录每一层中最大的元素即可。
  6. 最后返回答案数组。

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n 为二叉树节点个数,每一个节点仅会进出队列一次。
  • 空间复杂度:O(n)O(n),存储二叉树节点的空间开销。

代码实现

/**
 * 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;
        ans.clear();
        //如果根节点为空,返回空数组
        if(root == nullptr) return ans;
        //BFS层序遍历
        queue<TreeNode*> que;
        while(que.size()) que.pop();
        que.push(root);
        while(que.size()){
            //n为当前层元素个数
            int n = que.size();
            //m记录当前层最大值,初始化为最小值
            int m = INT_MIN;
            //遍历当前层所有元素
            for(int i = 0; i < n; i++){
                TreeNode* now = que.front();
                que.pop();
                //维护当前层最大值 m 
                m = max(m, now->val);
                //压入左右节点(如果不为空指针)
                if(now->left != nullptr) que.push(now->left);
                if(now->right != nullptr) que.push(now->right);
            }
            //记录当前层最大值
            ans.push_back(m);
        }
        return ans;
    }
};

总结

  • 该题核心思想为遍历,通过 BFS 广度优先搜索 可以实现二叉树的层序遍历,通过层序遍历记录每层最大值即可。
  • 还可以使用 DFS 深度优先搜索 来完成,在遍历时需要记录此时的层数,当我们遍历到某一层的元素时,只需维护对应层的最大值即可。
  • 测试结果:

微信截图_20220624112726.png

结束语

如果觉得生活不如意,不要一直钻牛角尖,去读读书吧,和书中的人物共历悲欢。当你了解了不一样的人生,收获了不一样的思想,你会发现,眼前的困难都是暂时的,人也就蓄满了重新出发的力量。