二叉树中的第K大层和

news2024/11/15 19:41:06

1.题目

这道题是2024-2-23的签到题,题目难度为中等。

考察知识点为BFS算法(树的层序遍历) + 大根堆(优先队列)。

题目链接:2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)

给你一棵二叉树的根节点 root 和一个正整数 k 。

树中的 层和 是指 同一层 上节点值的总和。

返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。

注意,如果两个节点与根节点的距离相同,则认为它们在同一层。

2.思路

这道题是一道综合性的题目,它考察了两个核心点:BFS算法和堆。整体思路如下:

首先我们利用BFS算法来对树进行层序遍历,在层序遍历的过程中我们同时求当前层的和,求完之后我们将这个值加入大根堆中,然后进行下一层的遍历,以此类推。

然后我们开始判断这个大根堆的长度是否大于等于k,如果满足则利用循环来将堆中元素弹出,最后返回最后一次弹出的值;否则则返回-1。

思路比较简单,下面是我的代码实现。

3.代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def kthLargestLevelSum(self, root: Optional[TreeNode], k: int) -> int:
        # 如果根节点为空
        if not root:
            return -1
        # 定义堆
        rst = []
        # 定义结点队列
        q = [root]
        # 当结点队列不为空
        while len(q) > 0:
            # 下一层的结点队列
            tmp = []
            # 保存当前层和
            s = 0
            # 遍历当前层的结点队列
            for node in q:
                # 求和
                s += node.val
                # 如果当前节点的左子结点不为空
                if node.left:
                    # 添加到下一层的结点队列
                    tmp.append(node.left)
                # 如果当前节点的右子结点不为空
                if node.right:
                    # 添加到下一层的结点队列
                    tmp.append(node.right)
            # 将当前层和加入到大根堆中,这里需要取负值(因为python默认是小根堆)
            heapq.heappush(rst,-s)
            # 更新结点队列为下一层
            q = tmp
        # 如果大根堆长度小于k
        if len(rst) < k:
            return -1
        # 保存最终结果
        r = 0
        # 循环弹出堆顶元素
        for i in range(k):
            r = -heapq.heappop(rst)
        # 返回最终元素
        return r




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习Day18——逻辑架构

一、逻辑架构剖析: 1.服务器处理客户端请求: 首先 MySQL 是典型的C/S架构&#xff0c;即client/Server架构&#xff0c;服务器端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是:客户端进程向服务器进程发送段文本(SQL语…

QT中调用python

一.概述 1.Python功能强大&#xff0c;很多Qt或者c/c开发不方便的功能可以由Python编码开发&#xff0c;尤其是一些算法库的应用上&#xff0c;然后Qt调用Python。 2.在Qt调用Python的过程中&#xff0c;必须要安装python环境&#xff0c;并且Qt Creator中编译器与Python的版…

docker 可视化管理工具 ui-for-docker

1、查询 docker search ui-for-docker 2、拉取镜像 docker pull uifd/ui-for-docker 3、运行启动容器 docker run -it -d \ --name docker-web \ -p 9010:9000 \ --privilegedtrue \ -v /var/run/docker.sock:/var/run/docker.sock \ ui-for-docker 4、页面访问 ​http:/…

vex-table链接

vxe-table v4https://vxetable.cn/#/table/start/quick

测试开源C#人脸识别模块DlibDotNet

百度“C# 换脸”找到参考文献4&#xff0c;发现其中使用DlibDotNet检测并识别人脸&#xff08;之前主要用的是ViewFaceCore&#xff09;&#xff0c;DlibDotNet是Dlib的.net封装版本&#xff0c;后者为开源C工具包&#xff0c;支持机器学习算法、图像处理等算法以支撑各类高级应…

应用感知型网络性能管理

网络基础设施似乎日益复杂和先进&#xff0c;迫使网络管理员抛弃传统的管理方法。应用感知型网络性能管理是一种用于监控网络性能的新型整体方法&#xff0c;它为管理员提供了强大的 IT 资源管理功能。应用感知型网络性能管理为 IT 管理员带来了精细视图、动态资源分配、主动故…

如何使用NPM包管理器在Node.js项目中安装和管理依赖

随着现代开发技术的快速发展&#xff0c;前端开发工程师们面临着越来越多的挑战。其中一个重要的挑战之一就是管理项目中的依赖关系。NPM&#xff08;Node Package Manager&#xff09;是一个业界领先的包管理器&#xff0c;被广泛应用于Node.js项目中。本文将详细介绍如何使用…

【 buuctf-NTFS 数据流】

这里要用到NtfsStreamEditor Ntfs数据流处理工具2.0 NtfsStreamsEditor 2.0 预览 090410更新_原创工具区_安全区 卡饭论坛 - 互助分享 - 大气谦和!可以从这个网站下载&#xff0c;注意包含 ntfs 数据流的压缩包要用 winrar 解压缩&#xff0c;扫描 flag 文件&#xff0c;会出现…

多模态AI产业链全景梳理

当前AI模型从单模态向多模态演进&#xff0c;有望实现认知智能&#xff0c;是AI未来发展的明确趋势。 近期 AI 多模态模型不断取得突破性进展。 OpenAI 于11 月发布了 GPT-4 Turbo 且开放了 GPTs再次颠覆行业&#xff0c;GPTs短期上线数量已超3万&#xff0c;揭开AIGC应用生态…

『运维备忘录』之 Ln 文件链接命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

Linux编译器---gcc/g++使用详解

目录 前言 gcc/g介绍 gcc/g的编译指令&#xff08;以gcc为例&#xff09; ​编辑 gcc选项 预处理(进行宏替换) 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&#xff09; 函数库 概念 …

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型

电气机械5G智能工厂数字孪生可视化平台&#xff0c;推进电气机械行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…

嵌入式stm32软件开发——中断概念

中断就是异常&#xff0c;异常就是中断 关注我&#xff0c;共同交流&#xff0c;一起成长 一、中断基础概念二、中断的编程要点三、中断控制器组四、关于EXIT外部中断 一、中断基础概念 关于中断这个东西&#xff0c;简单来说是程序进展过程中的重要节点&#xff0c;而在中断这…

C 嵌入式系统设计模式 10:中介者模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之三&…

https://registry.npm.taobao.org淘宝npm镜像仓库地址更新

在工作中有遇见获取淘宝的npm镜像存在问题&#xff0c;图示如下的报错&#xff1a; 根据报错的内容是说 https://registry.npm.taobao.org地址访问失败了&#xff0c;然后通过排查发现淘宝的npm镜像仓库地址有更新了。需要使用最新的地址 旧的淘宝镜像仓库&#xff1a;https://…

如何进行高性能架构的设计

一、前端优化 减少请求次数页面静态化边缘计算 增加缓存控制&#xff1a;请求头 减少图像请求次数&#xff1a;多张图片变成 一张。 减少脚本的请求次数&#xff1a;css和js压缩&#xff0c;将多个文件压缩成一个文件。 二、页面静态化 三、边缘计算 后端优化 从三个方面进…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的鸟类识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本文详细阐述了一个利用深度学习进行鸟类识别的系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类鸟类。文中不仅深入讲解了YO…

10.Halcon形态学膨胀,腐蚀,开运算,闭运算

膨胀:对边界点进行扩充,填充空洞&#xff0c;使边界向外部扩张的过程。 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉. 开运算: 先腐蚀后膨胀的过程称为开运算。 作用 : 去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积. 闭运…

用友U8库存展望数据显示错误

1、库存展望显示有订单在途。 2、双击查看明细&#xff0c;显示某个采购订单显示有预计入库量。 3、查询该采购订单&#xff0c;发现已入库完成未退货&#xff0c;确定为数据异常。 修改采购订单表体的iReceivedQTY(累计到货数量)字段后&#xff0c;恢复正常。 UPDATE dbo.PO_…

koa项目部署云服务器(部署本地虚拟机中)

文章目录 一、服务器安装Node、MySQL1.1. 安装Node.js1.2. 安装MySQL1.3.配置MySQL1.4. 数据库迁移 二. 部署Node项目2.1. 代码托管到Git仓库&#xff08;选做&#xff09;2.2. 代码clone到服务器&#xff08;选做&#xff09;2.3. VSCode中打开代码&#xff08;推荐&#xff0…