【力扣每日一题】力扣2583二叉树中第k大层和

题目来源

力扣2583二叉树中第k大层和

题目概述

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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值