【每日刷题】Day73

【每日刷题】Day73

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)

2. 1325. 删除给定值的叶子节点 - 力扣(LeetCode)

3. 1161. 最大层内元素和 - 力扣(LeetCode)

1. 2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)

//思路:深度优先遍历求层和+排序。深度优先遍历二叉树,以当前层为下标将当前层当前节点的值累加到数组对应下标位置。将所有层和求出后对数组排序,返回第K大层和。

typedef struct TreeNode TN;

//层和

void _kthLargestLevelSum(TN* root,long long* arr,int high)

{

    if(!root)

        return;

    arr[high]+=root->val;

    _kthLargestLevelSum(root->left,arr,high+1);

    _kthLargestLevelSum(root->right,arr,high+1);

}

//二叉树最大深度

int BinaryTreeHigh(TN* root)

{

    if(!root)

        return 0;

    int left = BinaryTreeHigh(root->left);

    int right = BinaryTreeHigh(root->right);

    return 1+(left>right?left:right);

}

void Swap(long long* x, long long* y)

{

    long long tmp = *x;

    *x = *y;

    *y = tmp;

}


 

//向下调整

void AdjustDown(long long* arr, int parents,int size)

{

    int child = parents * 2 + 1;

    while (child < size)

    {

        if (child + 1 < size && arr[child + 1] > arr[child])

        {

            child++;

        }

        if (arr[child] > arr[parents])

        {

            Swap(&arr[child], &arr[parents]);

        }

        else

        {

            break;

        }

        parents = child;

        child = parents * 2 + 1;

    }

}



 

//堆排序

void HeapSort(long long* arr, int size)

{

    //向下调整建堆

    for (int i = (size - 2) / 2; i >= 0; i--)

    {

        AdjustDown(arr, i, size);

    }

    while (size)

    {

        Swap(&arr[0], &arr[size - 1]);

        size--;

        AdjustDown(arr, 0, size);

    }

}

long long kthLargestLevelSum(struct TreeNode* root, int k)

{

    if(BinaryTreeHigh(root)<k)//如果不足K层,直接返回-1

        return -1;

    long long* arr = (long long*)calloc(100000,sizeof(long long));

    _kthLargestLevelSum(root,arr,0);//求出所有层和

    HeapSort(arr,100000);

    return arr[100000-k];

}

2. 1325. 删除给定值的叶子节点 - 力扣(LeetCode)

//思路:深度优先遍历。遍历二叉树,根据题目要求更改每个节点的left、right指针的指向。

// 如果遍历到的节点为NULL,直接返回NULL,让其上一个节点的left或right指向NULL

// 如果遍历到的节点为叶子节点且其值= target,也返回NULL,让其上一个节点的left或right指向NULL

// 如果遍历到的节点不是上述两个情况,则直接返回当前节点

typedef struct TreeNode TN;


//判断是否为叶子节点

bool IsLeafNode(TN* root)

{

    return !root->left&&!root->right;

}

//修改每个节点的left和right

TN* _removeLeafNodes(TN* root,int target)

{

    if(!root)

        return NULL;//情况①

    root->left = _removeLeafNodes(root->left,target);

    root->right = _removeLeafNodes(root->right,target);

    if(root->val==target&&IsLeafNode(root))//情况②

        return NULL;

    return root;//情况③

}

struct TreeNode* removeLeafNodes(struct TreeNode* root, int target)

{

    _removeLeafNodes(root,target);

    if(root->val==target&&IsLeafNode(root))

        return NULL;

    return root;

}

3. 1161. 最大层内元素和 - 力扣(LeetCode)

//思路:深度优先遍历+哈希。遍历二叉树,将每层的和以层数为下标存入数组中。随后遍历数组,找到下标最小(层数最小)且和最大的下标。

//注意:哈希数组中的所有初值必须为绝对最小(也就是任何层和都不能比它小),这样才能正确找到最小层数且最大层和的下标。

typedef struct TreeNode TN;

void _maxLevelSum(TN* root,int* hash,int k)

{

    if(!root)

        return;

    if(hash[k]<=-10000000)//由于需要求层和,因此需要将随机值初始化。

        hash[k]=0;

    hash[k]+=root->val;

    _maxLevelSum(root->left,hash,k+1);

    _maxLevelSum(root->right,hash,k+1);

}

int maxLevelSum(struct TreeNode* root)

{

    int* hash = (int*)malloc(sizeof(int)*1000);//开辟好后,数组中为随机值,其为一非常小的数字,满足我们上面的注意事项

    _maxLevelSum(root,hash,0);

    int max = -1000000000;

    for(int i = 0;i<1000;i++)

    {

        if(hash[i]>max)//找到最大层和的值

            max =  hash[i];

    }

    int* ans = (int*)malloc(sizeof(int)*1);

    for(int i = 0;i<1000;i++)

    {

        if(hash[i]==max)//找到第一个=最大层和的下标,即为最小下标(最小层数)

        {

            ans[0] = i+1;//因为树根节点在第一层,而数组下标从0开始,因此结果需要+1

            break;

        }

    }

    return ans[0];

}

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

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

相关文章

为 Android 应用打造精良的 Chrome OS 使用体验

override fun onKeyUp(code: Int, ev: KeyEvent?): Boolean { return when (code) { KeyEvent.KEYCODE_J -> { // Do something here true } else -> super.onKeyUp(code, ev) // 重要&#xff01;&#xff01; } } 注意我们标出 “重要” 的那一行代码。这行代…

同步FIFO

描述 根据题目提供的双口RAM代码和接口描述&#xff0c;实现同步FIFO&#xff0c;要求FIFO位宽和深度参数化可配置。 电路的接口如下图所示。 端口说明如下表。 双口RAM端口说明&#xff1a; 端口名 I/O 描述 wclk input 写数据时钟 wenc input 写使能 waddr input…

分布式架构的优势与实现

目录 前言1. 什么是分布式架构1.1 分布式架构的定义1.2 分布式架构的基本原理 2. 分布式架构的优势2.1 可扩展性2.2 容错性和高可用性2.3 性能优化2.4 灵活性和可维护性 3. 分布式架构的实现方法3.1 服务拆分3.1.1 功能拆分3.1.2 垂直拆分3.1.3 水平拆分 3.2 数据分布与存储3.2…

RabbitMQ消息队列 安装及基本介绍

一.MQ介绍 Message Queue &#xff08;MQ&#xff09;是一种跨进程的通信机制&#xff0c;用于在系统之间进行传递消息。MQ作为消息中间件&#xff0c;可以进行异步处理请求&#xff0c;从而减少请求响应时间和解耦 1.1 应用场景 1.1.1 系统之间通过MQ进行消息通信&#xff0…

使用Android Studio导入源码

2-1 基础准备工作 首先你得安装配置了Android Studio&#xff0c;具体不明白的参考《Android Studio入门到精通 》。 接着你得下载好了源码Code&#xff0c;至于如何下载这里不再说明&#xff0c;比较简单&#xff0c;上官网查看就行了。 其次你需要保证源码已经被编译生成了…

Scala运算符及流程控制

Scala运算符及流程控制 文章目录 Scala运算符及流程控制写在前面运算符算数运算符关系运算符赋值运算符逻辑运算符位运算符运算符本质 流程控制分支控制单分支双分支多分支 循环控制for循环while循环循环中断嵌套循环 写在前面 操作系统&#xff1a;Windows10JDK版本&#xff…

项目训练营第一天

项目训练营第一天 springboot后端环境搭建 1、首先需要找文章下载好tomcat、JDK、maven、mysql、IDEA。&#xff08;软件下载及环境变量配置略&#xff09; 2、在下载好的IDEA中&#xff0c;选择新建spring initial项目&#xff0c;选定java web&#xff0c;即可新建一个spri…

如何设置MySQL远程访问权限?

MySQL是一种流行的关系型数据库管理系统&#xff0c;它广泛应用于各种Web应用程序和数据驱动的应用中。在默认情况下&#xff0c;MySQL只允许本地访问&#xff0c;为了能够从远程服务器或客户端访问MySQL数据库&#xff0c;我们需要进行一些额外的设置和配置。 安装和配置MySQ…

OSPF 2类LSA详解

概述 上图为2类LSA : Network LSA 的报文格式 , 我们重点关注3个报文字段即可 , 其他内容没有实际的信息 Link State ID : DR的接口IP地址 Network Mask : 该MA网络的掩码 Attached Router : 连接在该MA网络的所有路由器的Router ID 2类LSA一定是DR产生的 , 关于OSPF DR的细节…

LeetCode 671.二叉树第二小的结点

这个题我们可以用数组辅助完成&#xff0c;然后进行排序后&#xff0c;再用再进行取值&#xff0c;这是我的代码块: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/void Preorde…

从工具产品体验对比spark、hadoop、flink

作为一名大数据开发&#xff0c;从工具产品的角度&#xff0c;对比一下大数据工具最常使用的框架spark、hadoop和flink。工具无关好坏&#xff0c;但人的喜欢有偏好。 目录 评价标准1 效率2 用户体验分析从用户的维度来看从市场的维度来看从产品的维度来看 3 用户体验的基本原则…

关于edge浏览器注册Kaggle不显示验证部分的问题

使用edge注册kaggle没有显示验证的部分导致无法完成注册 法一 谷歌大法好&#xff0c;使用谷歌注册就么有问题&#xff0c;然鹅需要魔法上网。 法二 使用 edge的Header Editor的插件 收到邮件后填写即可 参考博客&#xff1a; Kaggle平台注册弹不出验证码怎么办&#…

STM32读写备份寄存器和实时时钟

文章目录 1. 硬件电路 2. RTC操作注意事项 操作步骤 3. 代码实现 3.1 读写备份寄存器 3.1.1 main.c 3.2 实时时钟 3.2.1 MyRTC.c 3.2.2 MyRTC.h 3.2.3 main.c 1. 硬件电路 对于BKP备份寄存器和RTC实时时钟的详细解析可以看下面这篇文章&#xff1a; STM32单片机BKP备…

读线圈和离散状态寄存器信息

一.功能码操作类型 二.读线圈状态 需求实例 读取设备地址为 3 的从设备的线圈状态寄存器&#xff0c;线圈地址为 19 到 55&#xff08;从 0 开始计算&#xff09;共 37 个状态。 分析&#xff1a;由需求可知读取地址&#xff0c;则功能码是0x01,地址为3即为0x03,线圈地址为19到…

目前哪个充电宝品牌比较好?四款优质充电宝分享

在电量成为现代生活不可或缺的生产资源的时代&#xff0c;选择一款优质的充电宝无疑是保证移动设备持续运作的关键。面对市场上众多品牌和型号的充电宝&#xff0c;消费者在选择时可能会感到困惑和迷茫。本文将为您揭示哪些品牌真正代表了耐用性和质量的典范&#xff0c;让自己…

字节大神强推千页PDF学习笔记,弱化学历问题,已拿意向书字节提前批移动端!

主要问java&#xff0c;以及虚拟机&#xff0c;问了一点android 1.实习项目有关的介绍以及问题回答 2.反射与代理的区别&#xff0c;动态代理&#xff0c;静态代理&#xff0c;二者的区别&#xff0c;以及代理模式的UML图 3.字节码技术 4.虚拟机的双亲委派&#xff0c;以及好…

【需求管理】软件需求开发和管理文档(原件Word)

1. 目的 2. 适用范围 3. 参考文件 4. 术语和缩写 5. 需求获取的方式 5.1. 与用户交谈向用户提问题 5.1.1. 访谈重点注意事项 5.1.2. 访谈指南 5.2. 参观用户的工作流程 5.3. 向用户群体发调查问卷 5.4. 已有软件系统调研 5.5. 资料收集 5.6. 原型系统调研 5.6.1. …

envi5.6+SARscape560安装(CSDN_20240623)

envi和SARscape的版本必须匹配&#xff0c;否则有些功能不能使用。 Envi5.6安装 1. 点击安装程序. 2. 进入安装界面&#xff0c;点击“Next”. 3. 选择“I accept the agreement”&#xff0c;点击“Next”。 4. 选择安装路径&#xff0c;建议直接安装在默认路径下&#xff0…

Nginx实战:简单登录验证配置(基于openssl)

本文提供的是基于openssl创建的密码文件,对nginx指定的location访问。进行登录验证的配置方式。 1、验证页面配置 我的nginx实验环境是直接yum安装的,如果是自己编译安装的那么对应目录就是自己安装配置的目录。 先在/usr/share/nginx/html下创建一个usertest.html,里面添加…

威纶通触摸屏以太网一机多屏设置

STEP 1 新增本机PLC&#xff0c;与PLC的通讯参数设置 STEP2 新增远端PLC&#xff0c;使用以太网方式&#xff0c;IP与主屏保持一致 PLC类型、接口类型与主屏上保持一致 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~