【Leetcode】2583. 二叉树中的第 K 大层和

文章目录

题目

题目链接

给你一棵二叉树的根节点 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

思路

今天的题目比较简单,主要就是先求出来整个二叉树的每一层的和,然后再找出这些和里面第 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();
    }
};

结果

相关推荐
-To be number.wan35 分钟前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
YGGP43 分钟前
【Golang】LeetCode 64. 最小路径和
算法·leetcode
古城小栈2 小时前
Rust变量设计核心:默认不可变与mut显式可变的深层逻辑
算法·rust
电商API&Tina2 小时前
跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程
大数据·服务器·数据库·python·算法·json·图搜索算法
XXYBMOOO2 小时前
内核驱动开发与用户级驱动开发:深度对比与应用场景解析
linux·c++·驱动开发·嵌入式硬件·fpga开发·硬件工程
LYFlied3 小时前
【每日算法】LeetCode 1143. 最长公共子序列
前端·算法·leetcode·职场和发展·动态规划
长安er4 小时前
LeetCode 20/155/394/739/84/42/单调栈核心原理与经典题型全解析
数据结构·算法·leetcode·动态规划·
MarkHD4 小时前
智能体在车联网中的应用:第28天 深度强化学习实战:从原理到实现——掌握近端策略优化(PPO)算法
算法
能源系统预测和优化研究4 小时前
【原创代码改进】考虑共享储能接入的工业园区多类型负荷需求响应经济运行研究
大数据·算法
yoke菜籽5 小时前
LeetCode——三指针
算法·leetcode·职场和发展