目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:. - 力扣(LeetCode)
描述:
给你一棵二叉树的根节点 root
和一个正整数 k
。
树中的 层和 是指 同一层 上节点值的总和。
返回树中第 k
大的层和(不一定不同)。如果树少于 k
层,则返回 -1
。
注意,如果两个节点与根节点的距离相同,则认为它们在同一层。
示例 1:
输入:root = [5,8,9,2,1,3,7,4,6], k = 2 输出:13 解释:树中每一层的层和分别是: - Level 1: 5 - Level 2: 8 + 9 = 17 - Level 3: 2 + 1 + 3 + 7 = 13 - Level 4: 4 + 6 = 10 第 2 大的层和等于 13 。
示例 2:
输入:root = [1,2,null,3], k = 1 输出:3 解释:最大的层和是 3 。
提示:
- 树中的节点数为
n
2 <= n <= 105
1 <= Node.val <= 106
1 <= k <= n
解题思路:
构建一个数组,存放每个层级的值之和。
使用searchTreeNode方法进行深度搜索,传入参数为当前节点以及所在层级。
最后对层级数组进行排序,倒序取第k位即可。
代码:
/**
* 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:
long long kthLargestLevelSum(TreeNode *root, int k)
{
vector<long long> levelSum;
searchTreeNode(levelSum, root, 0);
sort(levelSum.begin(), levelSum.end());
if (static_cast<int>(levelSum.size()) - k < 0)
{
return -1;
}
return levelSum[levelSum.size() - k];
}
void searchTreeNode(vector<long long> &levelSum, TreeNode *root, int level)
{
if (root == nullptr)
{
return;
}
addLevelValue(levelSum, level, root->val);
searchTreeNode(levelSum, root->left, level + 1);
searchTreeNode(levelSum, root->right, level + 1);
}
void addLevelValue(vector<long long> &levelSum, int level, int value)
{
if (level == levelSum.size())
{
levelSum.push_back(value);
}
else
{
levelSum[level] += value;
}
}
};