题目来源
题目概述
给你一棵二叉树的根节点 root 和一个正整数 k 。
树中的 层和 是指 同一层 上节点值的总和。
返回树中第 k 大的层和(不一定不同)。如果树少于 k
层,则返回 -1 。
注意,如果两个节点与根节点的距离相同,则认为它们在同一层。
思路分析
通过层序遍历可以很方便的求出每层的和。 对每层和进行排序,输出第[k]个值就是结果。
代码实现
java实现
public class Solution {
public long kthLargestLevelSum(TreeNode root, int k) {
List<TreeNode> parentList = Collections.singletonList(root);
List<Long> layerSumQueue = new ArrayList<>();
// 层序遍历并求和
while (!parentList.isEmpty()){
long layerSum = 0;
List<TreeNode> childList = new ArrayList<>();
for (TreeNode parent : parentList) {
layerSum += parent.val;
if (parent.left != null) childList.add(parent.left);
if (parent.right != null) childList.add(parent.right);
}
parentList = childList;
layerSumQueue.add(layerSum);
}
if (layerSumQueue.size() < k) {
return -1;
}
// 使用流取第k大
return layerSumQueue.stream()
.sorted()
.skip(layerSumQueue.size() - k)
.findFirst()
.orElse(-1L);
}
}
c++实现
class Solution {
public:
long long kthLargestLevelSum(TreeNode* root, int k) {
vector<TreeNode*> parent_list;
parent_list.push_back(root);
vector<long> layer_sum_list;
// 层序遍历,求和
while (!parent_list.empty()) {
long layer_sum = 0;
vector<TreeNode*> child_list;
for (TreeNode* parent : parent_list) {
layer_sum += parent->val;
if (parent->left != nullptr) child_list.push_back(parent->left);
if (parent->right != nullptr) child_list.push_back(parent->right);
}
parent_list = child_list;
layer_sum_list.push_back(layer_sum);
}
if (layer_sum_list.size() < k) {
return -1;
}
// 排序并取第k大
sort(layer_sum_list.rbegin(), layer_sum_list.rend());
return layer_sum_list[k - 1];
}
}