LeetCode第2583题

难度:中等

给你一棵二叉树的根节点 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大的层和,可以使用BFS计算每一层节点的和,然后对这些和从大到小排序,最后取出第k个值即可。

关于二叉树的BFS遍历我们前面也多次讲过,需要使用一个队列来记录每层的节点,当遍历队列中节点的时候需要累加当前层的和,顺便把下一层的节点也添加到队列中。

JAVA:

public long kthLargestLevelSum(TreeNode root, int k) {
    List<Long> mList = new ArrayList<>();
    Queue<TreeNode> q = new LinkedList<>();// 创建队列
    q.offer(root);// 根节点添加到队列中
    while (!q.isEmpty()) {
        int size = q.size();// 当前层的节点个数
        long sum = 0;// 当前层所有节点的和
        while (size-- > 0) {
            TreeNode cur = q.poll();// 出队
            sum += cur.val;// 累加当前层节点的值
            // 当前节点的左右子树如果不为空,也添加到队列中
            if (cur.left != null) q.offer(cur.left);
            if (cur.right != null) q.offer(cur.right);
        }
        mList.add(sum);// 当前层的和计算完之后添加到list中
    }
    if (mList.size() < k)// 如果少于k层,返回-1。
        return -1;
    // 从大到小排序,然后取出第k个元素
    Collections.sort(mList, (a, b) -> Long.compare(b, a));
    return mList.get(k - 1);
}

C++:

public:
    long long kthLargestLevelSum(TreeNode *root, int k) {
        vector<long long> mList;
        queue<TreeNode *> q;// 创建队列
        q.push(root);// 根节点添加到队列中
        while (!q.empty()) {
            int size = q.size();// 当前层的节点个数
            long sum = 0;// 当前层所有节点的和
            while (size-- > 0) {
                TreeNode *cur = q.front();
                q.pop();// 出队
                sum += cur->val;// 累加当前层节点的值
                // 当前节点的左右子树如果不为空,也添加到队列中
                if (cur->left) q.push(cur->left);
                if (cur->right) q.push(cur->right);
            }
            mList.push_back(sum);// 当前层的和计算完之后添加到list中
        }
        if (mList.size() < k)// 如果少于k层,返回-1。
            return -1;
        // 从大到小排序,然后取出第k个元素
        sort(mList.begin(), mList.end(), greater<long>());
        return mList[k - 1];
    }

C:

#define n 100000

// 比较函数,用于从大到小排序
int cmp(const void *a, const void *b) {
    long long ta = *((long long *) a);
    long long tb = *((long long *) b);
    if (ta < tb)
        return 1;
    return -1;
}

long long kthLargestLevelSum(struct TreeNode *root, int k) {
    long long *mList = malloc(n * sizeof(long long));
    struct TreeNode **q = malloc(n * sizeof(struct TreeNode *));// 创建队列
    int left = 0, right = 0;// 左闭右开区间
    int count = 0;
    q[right++] = root;// 根节点添加到队列中
    while (left != right) {
        int size = right - left;// 当前层的节点个数
        long long sum = 0;// 当前层所有节点的和
        while (size-- > 0) {
            struct TreeNode *cur = q[left++];// 出队
            sum += cur->val;// 累加当前层节点的值
            // 当前节点的左右子树如果不为空,也添加到队列中
            if (cur->left)
                q[right++] = cur->left;
            if (cur->right)
                q[right++] = cur->right;
        }
        mList[count++] = sum;// 当前层的和计算完之后添加到mList中
    }
    if (count < k)// 如果少于k层,返回-1。
        return -1;
    // 从大到小排序,然后取出第k个元素
    qsort(mList, count, sizeof(long long), cmp);// 先排序
    long long ans = mList[k - 1];
    free(mList);
    free(q);
    return ans;
}

Python:

def kthLargestLevelSum(self, root: Optional[TreeNode], k: int) -> int:
    mList = []
    q = deque([root])  # 创建队列
    while q:
        levelSum = 0  # 当前层所有节点的和
        for _ in range(len(q)):
            cur = q.popleft()  # 出队
            levelSum += cur.val  # 累加当前层节点的值
            # 当前节点的左右子树如果不为空,也添加到队列中
            if cur.left: q.append(cur.left)
            if cur.right: q.append(cur.right)
        mList.append(levelSum)  # 当前层的和计算完之后添加到list中

    if len(mList) < k:  # 如果少于k层,返回-1。
        return -1
    # 从大到小排序,然后取出第k个元素
    mList.sort(reverse=True)
    return mList[k - 1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487832.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:LeeCode-21、合并两个有序链表【链表+递归+非递归】

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚&#xff0c;财联社报道&#xff0c;百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈&#xff0c;最后确定由百度提供这项服务&#xff0c;苹果预计采取 API 接口的方式计费。 苹果将…

深入了解直播美颜技术:美颜SDK的性能优化与算法创新

美颜技术的核心是美颜SDK&#xff0c;它不仅仅是简单的滤镜应用&#xff0c;更是依托着先进的算法和性能优化实现的。接下来&#xff0c;小编将深度探讨美颜SDK的性能优化与算法创新&#xff0c;带您了解这一领域的最新进展。 一、美颜技术的发展历程 随着移动设备性能的提升和…

weindos的docker 运行Hyperf 日志

weindos的docker 运行日志 进入cmd窗口 docker run --name hyperf -v D:\phpstudy_pro\WWW\hyperf.com\hyperf-skeleton:/data/project -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf-skeleton:latest D:\phpstudy_pro\WWW\hyperf.com\hyperf-skeleton是…

vscode添加gitee

1.创建仓库 2.Git 全局设置 3.初始化仓库 2.1 打开vscode打开需要上传到给git的代码文件 2.2.点击左边菜单第三个的源代码管理->初始化仓库 4.点击加号暂存所有更改 5.添加远程仓库 5.1 添加地址&#xff0c;回车 5.2 填写库名&#xff0c;回车 6.提交和推送 6.1 点击✔提交…

安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法

安防监控视频平台EasyCVR具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强&#xff0c;支持Windows系…

从0到1:校园生活圈小程序开发笔记(一)

可行性研究 校园生活圈小程序是一种面向大学或学院校园的社交平台&#xff0c;旨在为校园内的师生提供交流、分享、互助和信息发布等功能。 为校园内的师生提供一个便捷的平台&#xff0c;帮助他们更好地了解校园生活、参与校园活动、交流学习和共享资源。 功能分解 公告资讯…

关于RPC

初识RPC RPC VS REST HTTP Dubbo Dubbo 特性&#xff1a; 基于接口动态代理的远程方法调用 Dubbo对开发者屏蔽了底层的调用细节&#xff0c;在实际代码中调用远程服务就像调用一个本地接口类一样方便。这个功能和Fegin很类似&#xff0c;但是Dubbo用起来比Fegin还要简单很多&a…

Vue3 + Vite + TS + Element-Plus + Pinia项目(5)对axios进行封装

1、在src文件夹下新建config文件夹后&#xff0c;新建baseURL.ts文件&#xff0c;用来配置http主链接 2、在src文件夹下新建http文件夹后&#xff0c;新建request.ts文件&#xff0c;内容如下 import axios from "axios" import { ElMessage } from element-plus im…

Pillow教程05:NumPy数组和PIL图像的相互转化

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议&#xff1a;本文长期更新&#xff0c;建议点赞/收藏&#xff01; 1. 啥是Qt Design Studio&#xff1f; Qt Design Studio 是一个用于设计和开发用户界面的工具&#xff0c;特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程&#xff0c;使得设计师和开发者可…

Unity 视频组件 VideoPlayer

组件添加&#xff1a; 在自己定义的组件下&#xff08;例如&#xff1a;Panel&#xff09; 点击 Inspector 面板中的 AddComponent &#xff0c;输入“VideoPlayer”。 资源 这里 视频资源有两种形式&#xff0c;第一种是 VideoClip &#xff0c;需要将视频文件拖拽到该属性字段…

CI/CD实战-jenkins结合docker 5

实验准备&#xff1a; 在docker主机要下载git工具 禁掉key的校验 确保在立即构建项目时不会出现任何报错&#xff1a; 自动化构建docker镜像 在server3上安装docker-ce 修改内核参数 拷贝证书 添加默认仓库 添加harbor仓库的解析 测试拉取 登录harbor私有仓库 在jenkins安装d…

解锁未知领域:探索Web3技术的无限可能性

随着数字化时代的持续发展&#xff0c;Web3技术作为下一代互联网的重要组成部分&#xff0c;正呈现出无限的创新可能性。本文将深入探索Web3技术所带来的无限可能性&#xff0c;揭示其在各个领域的应用前景和潜力。 1. 区块链技术的革命性 Web3的核心是区块链技术&#xff0c;…

SpringBoot集成WebSocket(实时消息推送)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

机器学习 - 神经网络分类

什么叫做分类问题&#xff1f; A classification problem involves predicting whether something is one thing or another. Problem typeWhat is it?ExampleBinary classificationTarget can be one of two options, e.g. yes or noPredict whether or not someone has hea…

UDP实现聊天室

现象&#xff1a; 源码&#xff1a; 服务器&#xff1a; #include<myhead.h>struct sockaddr_in serveraddr,caddr; enum type_t//枚举 {Login,Chat,Quit, }; typedef struct MSG {char type;//L C Qchar name[32];//char text[128];// }msg_t;typedef struct NODE//链…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…

HarmonyOS模拟器调试

1 、设置 -> 系统设置 -> 关于手机 快速点击 5 次 HarmonyOS 版本开启开发者模式。 2 、设置 -> 系统和更新 -> 开发人员选项 到开发人员选项后往下拉有 USB 调试 &#xff0c;把 USB 调试开关打开。 源自&#xff1a;HarmonyOS HarmonyOS Next 仿小米商城App入门…

Prompt提示工程上手指南:基础原理及实践(四)-检索增强生成(RAG)策略下的Prompt

前言 此篇文章已经是本系列的第四篇文章&#xff0c;意味着我们已经进入了Prompt工程的深水区&#xff0c;掌握的知识和技术都在不断提高&#xff0c;对于Prompt的技巧策略也不能只局限于局部运用而要适应LLM大模型的整体框架去进行改进休整。较为主流的LLM模型框架设计可以基…