Leetcode 5052. 最大层内元素和 (150周赛)

5052. 最大层内元素和

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

示例:

输入:[1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

提示:

  1. 树中的节点数介于 1 和 10^4 之间
  2. -10^5 <= node.val <= 10^5

      通过层序遍历的方式,对每层进行值求和,最后进行比较输出即可。

class Solution {
public:
    #define INF (0x3f3f3f3f)
    struct jie {
	int ceng;
	TreeNode *t;
	jie(int too, TreeNode *lenthh) {
		ceng = too; t = lenthh;
	    }
    };
	int Level_Find(jie J)
	{
		if (J.t == NULL)
			return -1;
		int Sum = 0, Max= -100007 ,C = J.ceng;
		vector<pair<int, int>>res;
		queue <jie >room;
		room.push(J);
		while (!room.empty())
		{
			jie save = room.front();
			room.pop();
			if (save.ceng != C)
			{
				res.push_back(make_pair(Sum, Max));
                C = save.ceng ;
                //cout <<"c="<< C <<" save_C ="<< save.ceng <<' '<< Sum <<"  s  m =" <<Max<<endl;
				Sum = 0;
				Max = -100007;
			}

			Sum += save.t->val;
			Max = max(Max, save.t->val);
            //cout << Sum << ' ' << Max <<endl;
			if (save.t->left)
				room.push(jie(save.ceng + 1, save.t->left));
			if (save.t->right)
				room.push(jie(save.ceng + 1, save.t->right));
		}
		int res_max = -INF,c_max = 0, d_max = 0;
		for (int i = 0; i < res.size(); ++i)
		{
			if (res[i].first > res_max)
			{
				res_max = res[i].first;
				d_max = res[i].second;
				c_max = i + 1;
			}
		}
		return c_max;
	}
	int maxLevelSum(TreeNode* root) {
		return Level_Find(jie(1, root));
	}
};
发布了104 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yanpr919/article/details/99706945