文章目录
题目
给你一棵二叉树的根节点 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 <= 10^5^
1 <= Node.val <= 10^6^
1 <= k <= n
思路
今天的题目比较简单,主要就是先求出来整个二叉树的每一层的和,然后再找出这些和里面第 k 大的数就可以了,层序遍历可以使用简单的队列实现广度优先搜索,每一层寻找完毕之后可以使用一个小根堆进行存储或者是一个简单的数组存储,如果是数组的话就需要进行排序,如果是大顶堆就需要每次注意堆里面的元素个数超出 k 的时候把最小的元素踢出去。
代码
c++
class Solution {
public:
long long kthLargestLevelSum(TreeNode* root, int k) {
priority_queue<long long,vector<long long>,greater<long long>> pq;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()) {
long long sum=0;
int size=que.size();
for(int i=0;i<size;++i) {
auto node=que.front();
que.pop();
sum+=node->val;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
pq.push(sum);
if(pq.size()>k) pq.pop();
}
if(pq.size()<k)return -1;
return pq.top();
}
};