当前位置: 首页 > news >正文

Leetcode2583. 二叉树中的第 K 大层和

Every day a Leetcode

题目来源:2583. 二叉树中的第 K 大层和

解法1:层序遍历 + 排序

先使用层序遍历计算出树的每一层的节点值的和,保存在数组 levelSum 中。然后将数组进行排序,返回第 k 大的值。需要考虑数组长度小于 k 的边界情况。

代码:

/** @lc app=leetcode.cn id=2583 lang=cpp** [2583] 二叉树中的第 K 大层和*/// @lc code=start
/*** 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){if (root == nullptr)return -1;vector<long long> levelSum;queue<TreeNode *> q;q.push(root);while (!q.empty()){int size = q.size();long long sum = 0LL;for (int i = 0; i < size; i++){TreeNode *node = q.front();q.pop();sum += node->val;if (node->left)q.push(node->left);if (node->right)q.push(node->right);}levelSum.push_back(sum);}if (levelSum.size() < k)return -1;sort(levelSum.begin(), levelSum.end());return levelSum[levelSum.size() - k];}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 是二叉树的节点个数。

空间复杂度:O(n),其中 n 是二叉树的节点个数。

解法2:层序遍历 + 快速选择

也可以使用快速选择的算法快速定位第 k 大的元素。

代码:

// 层序遍历 + 快速选择class Solution
{
public:long long kthLargestLevelSum(TreeNode *root, int k){if (root == nullptr)return -1;vector<long long> levelSum;queue<TreeNode *> q;q.push(root);while (!q.empty()){int size = q.size();long long sum = 0LL;for (int i = 0; i < size; i++){TreeNode *node = q.front();q.pop();sum += node->val;if (node->left)q.push(node->left);if (node->right)q.push(node->right);}levelSum.push_back(sum);}int n = levelSum.size();if (k > n)return -1;ranges::nth_element(levelSum, levelSum.begin() + (n - k));return levelSum[n - k];}
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 是二叉树的节点个数。

空间复杂度:O(n),其中 n 是二叉树的节点个数。

http://www.lryc.cn/news/305126.html

相关文章:

  • (六)激光线扫描-三维重建
  • CSS 面试题汇总
  • 定制你的【Spring Boot Starter】,加速开发效率
  • Vue源码系列讲解——生命周期篇【二】(new Vue)
  • JavaScript 设计模式之观察者模式
  • 数据结构D4作业
  • springboot750人职匹配推荐系统
  • 【笔记】【开发方案】APN 配置参数 bitmask 数据转换(Android KaiOS)
  • Redis篇之缓存雪崩、击穿、穿透详解
  • 【深度学习笔记】3_2线性回归的从零实现
  • Apache Maven简介
  • #12解决request中getReader()和getInputStream()只能调用一次的问题
  • 直接插入排序+希尔排序+冒泡排序+快速排序+选择排序+堆排序+归并排序+基于统计的排序
  • Java高级 / 架构师 场景方案 面试题(二)
  • C/C++内存管理学习【new】
  • 选择适合你的编程语言
  • 【力扣每日一题】力扣106从中序和后序遍历序列构造二叉树
  • logback日志回滚原理
  • [C#]winform基于opencvsharp结合pairlie算法实现低光图像增强黑暗图片变亮变清晰
  • React18源码: reconcliler启动过程
  • 【RN】为项目使用React Navigation中的navigator
  • CS50x 2024 - Lecture 8 - HTML, CSS, JavaScript
  • C++:派生类的生成过程(构造、析构)
  • 金蝶字段添加过滤条件
  • SQLite 知识整理
  • 0基础JAVA期末复习最终版
  • 【办公类-16-07-04】合并版“2023下学期 中班户外游戏(有场地和无场地版,一周一次)”(python 排班表系列)
  • chat GPT第一讲
  • JAVA工程师面试专题-Mysql篇
  • vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法