1161 Maximum Level Sum of a Binary Tree

178 篇文章 0 订阅
9 篇文章 0 订阅

1 题目

Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on.

Return the smallest level X such that the sum of all the values of nodes at level X is maximal.

Example 1:

Input: [1,7,0,7,-8,null,null]
Output: 2
Explanation: 
Level 1 sum = 1.
Level 2 sum = 7 + 0 = 7.
Level 3 sum = 7 + -8 = -1.
So we return the level with the maximum sum which is level 2.

 2 尝试解

2.1 分析

对于二叉树,求每一层所有节点值之和,问和最大的是哪层。

典型的广度优先题目,用一个队列从根节点开始存储当前层的节点,然后在计算本层和之时,将下一层节点同时放入新的队列。

2.2 代码

class Solution {
public:
    int maxLevelSum(TreeNode* root) {
        int sum = INT_MIN;
        int level = 1;
        int result = 0;
        queue<TreeNode*> cur;
        cur.push(root);
        while(cur.size()){
            int cur_sum = 0;
            queue<TreeNode*> next;
            while(cur.size()){
                cur_sum += cur.front()->val;
                if(cur.front()->left) next.push(cur.front()->left);
                if(cur.front()->right) next.push(cur.front()->right);
                cur.pop();
            }
            if(cur_sum > sum){
                sum = cur_sum;
                result = level; 
            }
            level ++;
            swap(cur,next);
        }
        return result;
    }
};

 3 标准解

class Solution {
public:
    int maxLevelSum(TreeNode* root) {
        if (root == NULL) return 0;
        int res = 0, level = 0, global_sum = 0;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            int count = q.size(), tmp_sum = 0;
            while (count--) {
                TreeNode* tmp = q.front();
                q.pop();
                tmp_sum += tmp->val;
                if (tmp->left) q.push(tmp->left);
                if (tmp->right) q.push(tmp->right);
            }
            level++;
            if (tmp_sum > global_sum) res = level;
            global_sum = max(tmp_sum, global_sum);
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值