加载中...
剑指 Offer II 044-二叉树每层的最大值
发表于:2021-12-03 | 分类: 中等
字数统计: 589 | 阅读时长: 2分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/hPov7L

中文题目

给定一棵二叉树的根节点 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.com/problems/find-largest-value-in-each-tree-row/

通过代码

高赞题解

层次遍历

因为要求解二叉树每一层的最大值,所以使用二叉树的层次遍历是最适合不过的。但是因为需要求二叉树的每一层的最大值,所以需要确定哪些节点属于同一层。一种简单的方式就是,在遍历完当前层的最后一个节点之后,队列中所保存的节点数就是下一层的节点数。如下图所示,红色节点为当前层的最后一个节点,绿色为处于队列中的下一层的所有节点。因为队列的初始状态是只有一个不为空的根节点,所以第一层就是一个节点,第二次就是遍历完根节点之后的队列中的节点,以此类推。

477afe8550c13a4e1e3c0e726bdf67a.jpg

代码如下,注意空根节点的判断,另外注意 size 必须在进入 for 循环前就确定,而不是使用 que.size(),因为队列大小实时在改变。

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        if (root == nullptr) {
            return {};
        }
        vector<int> allMax;
        queue<TreeNode*> que;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            int curMax = INT_MIN;
            for (int i = 0; i < size; ++i) {
                TreeNode* node = que.front();
                que.pop();
                curMax = max(curMax, node->val);
                if (node->left != nullptr) {
                    que.push(node->left);
                }
                if (node->right != nullptr) {
                    que.push(node->right);
                }
            }
            allMax.push_back(curMax);
        }
        return allMax;
    }
};

统计信息

通过次数 提交次数 AC比率
4851 7517 64.5%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
剑指 Offer II 107-矩阵中的距离
下一篇:
剑指 Offer II 045-二叉树最底层最左边的值
本文目录
本文目录