LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

news2024/11/19 14:50:29

作者:小迅
链接:https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2279048/di-gui-zhu-shi-chao-ji-xiang-xi-by-xun-g-7rfd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

 

示例

 

 

思路

 

给定一个二叉树,删除 “根-叶” 路径上值的总和小于 limit 的节点

任何一条有效路径的起点都是根节点,而终点都是叶子节点,中间节点值的累和就是当前路径的有效值,如果有效值小于limit,则将该路径的叶子节点删除,那么删除的叶子节点的父节点就将成为当前路径的尾子节点。

  • 如果该节点还有子节点的话,该路径就相当于该道了,就需要重复之前的判断,看看是否需要删除子节点;
  • 如果该节点没有子节点的话,就说明该节点为当前路径的叶子节点,需要删除,因为当前路径累和没有大于limit。

所以当前节点是否要删除取决于当前节点的子节点

  • 如果当前节点左右子节点都会被删除,那么当前节点也要被删除
  • 如果当前节点左右子节点有一个没有被删除,那么当前节点就不会被删除

综上本题就是二叉树的后序遍历,先处理子节点,再处理根节点。

:当有需要单调处理头节点时,常用的做法是申请一个哨兵节点,指向头节点,可以避免单调处理头节点

代码注释超级详细

代码


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
#define MAX(a, b) ((a) > (b) ? (a) : (b))

void delete(struct TreeNode* root)//删除节点
{
    if (root == NULL) return;//已经为空,则结束
    delete(root->left);//递归删除
    delete(root->right);
    root->left = NULL;//删除本节点
    root->right = NULL;
    free(root);
    return;
}

int dfs(struct TreeNode* root, int limit, int val)
{
    if (root->left == NULL && root->right == NULL) {//叶子节点
        return (root->val + val) < limit ? 1 : 0;//整个路径有效值小于limit
    }
    int left = 1, right = 1;// 1 表示需要删除
    //后序遍历
    if (root->left) left = dfs(root->left, limit, root->val+val);
    if (root->right) right = dfs(root->right, limit, root->val+val);
    if (left) {//左节点需要删除
        delete(root->left);
        root->left = NULL;
    }
    if (right) {//有节点需要删除
        delete(root->right);
        root->right = NULL;  
    }
    return left && right;//如果子节点都删除,自己也没必要活着,此路不通
}

struct TreeNode* sufficientSubset(struct TreeNode* root, int limit){
    struct TreeNode* head = malloc(sizeof(struct TreeNode));
    head->val = 0;
    head->left = root;
    head->right = NULL;//构造哨兵
    dfs(head, limit, 0);
    root = head->left;
    head->left = NULL;
    free(head);//销毁哨兵
    return root;
}

作者:小迅
链接:https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2279048/di-gui-zhu-shi-chao-ji-xiang-xi-by-xun-g-7rfd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

如何使用 VSCode 软件运行C代码

VSCode 的下载和扩展的配置可以参考文章&#xff1a;VSCode 的安装与插件配置。 VSCode 是很好用的编辑器&#xff0c;通过给其配置 MinGW-w64 插件就可以在它上面编译运行C代码了。 在没有配置 MinGW-w64 插件时&#xff0c;在 VSCode 中运行下面的代码后打印如下图所示。 这…

【C语言】C的编译过程预处理

目录 一、 程序的翻译环境和执行环境1、翻译环境预处理编译汇编链接 2、执行环境 二、预处理详解1、预定义符号2、#define#define 语法#define 定义宏#define 替换规则 3、#和##4、宏和函数对比 一、 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不…

为什么我们拥有庞大的语言模型,而Vision Transformers的规模却很小?

编者按&#xff1a;本文探讨了语言模型为何会比视觉模型的参数数量大得多的原因&#xff0c;并详细介绍了传统ViT训练方法在扩展时出现不稳定性的问题。 为此&#xff0c;本文介绍了如何改进架构以实现扩展&#xff0c;并讨论了实现模型最优状态的方法。同时&#xff0c;如何在…

Docker部署skywalking9.2版本

注意使用docker部署skywalking和使用tar包部署有点不一样OAP和UI需要分别部署原因是&#xff1a; SkyWalking UI 和 OAP 是 SkyWalking 的两个主要组件&#xff0c;它们之间的关系是前端和后端的关系。SkyWalking UI 是一个 Web 应用程序&#xff0c;它提供了一个漂亮的 UI 界面…

连续降税、人民币结算,巴西潜力爆发!开发细节见内!

本文内容 /CONTENT 01/中巴贸易现状 02/主要进口类别 03/通关和贸易政策 04/市场商业环境 05/本地公司的注册程序 06/巴西的主要节日 最近巴西降低关税&#xff0c;宣布人民币结算。想转市场的朋友不妨考虑巴西。 巴西作为南美洲最大的国家&#xff0c;当地人口占53%(…

ios音频焦点

音频焦点 两个或者两个以上的app可以同时向同一输出流播放音频。系统会将所有音频流混合在一起&#xff0c;但这样会给用户带来很大的困扰。为了避免所有音乐app同时播放&#xff0c;ios引入了“音频焦点”的概念。在ios中&#xff0c;音频焦点是操作系统为了管理音频硬件而引…

uvc驱动ioctl分析上

uvc驱动ioctl分析上 文章目录 uvc驱动ioctl分析上uvc_ioctl_querycap查询设备的能力uvc_ioctl_enum_fmt处理V4L2设备的枚举格式&#xff08;enum_fmt&#xff09;的ioctl操作uvc_ioctl_enum_fmt_vid_out枚举视频输出格式uvc_ioctl_enum_fmt_vid_cap枚举视频捕获格式 uvc_v4l2_g…

低代码到底有多爽?解放双手,推荐一款C端的低代码产品

前言引入 低代码&#xff08;LowCode&#xff09;就是一种可视化搭建系统&#xff0c;从字面意思来讲&#xff0c;一是可视化&#xff1b;二是少写代码。由此可见&#xff0c;低代码的出现是为了减轻和降低开发者的负担&#xff0c;让开发者减少重复劳动&#xff0c;避免资源和…

基于Angular+Nginx+Java+Spring开发的医院信息系统(HIS)源码

基于云计算技术的SaaS服务的医院信息系统源码 云HIS系统有效实现医疗数据共享与交换&#xff0c;解决数据重复采集及信息孤岛等问题。重构管理服务流程&#xff0c;重建统一的信息架构体系&#xff0c;重造病人服务环境&#xff0c;向不同类型的医疗机构提供SaaS化HIS服务解决…

如何在不损失质量的情况下压缩优化图像大小

您是否知道在将图像上传到 WordPress 之前对其进行优化会对您的网站速度产生巨大影响&#xff1f; 在开始时&#xff0c;许多初学者只是简单地上传图片&#xff0c;而没有针对网络对其进行优化。这些大图像文件会使您的网站变慢。 您可以通过将图像优化最佳实践作为常规博客程…

如何对高压功率放大器进行初步故障排查?

在使用测试仪器仪表进行实验检测的过程中&#xff0c;可能多少都遇到过这种情况&#xff1a;仪器开不了机无法点亮、设备幅值与理论值有较大差距、输出电压波形失真、设备异常过载、设备异响异味等等.... 作为测试仪器仪表的一种&#xff0c;功率放大器也可能会出现这种情况&a…

基于Java+SpringMvc+vue+element实现高效学生社团平台管理

基于JavaSpringMvcvueelement实现高效学生社团平台管理 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

基于Java+Springmvc+vue+element实现高校心理健康系统详细设计和实现

基于JavaSpringmvcvueelement实现高校心理健康系统详细设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

将java项目导出jar包,转成在windows上的可执行文件(没有java运行环境的电脑也可以)

前言 提示&#xff1a;直接将java运行环境一起打包没有java运行环境的电脑也可以&#xff1a; 近期在做一个java串口项目&#xff0c;需要将完整的项目导出.exe文件在没有java环境的电脑上运行&#xff0c;下面是详细的操作步骤以及遇到各种问题的解决办法.。 说明&#xff1…

HTTPS加密的简单介绍

前言 假设客户端给服务器发送HTTP请求,此时的数据都是明文的,如果黑客在这个过程中截取到了数据,进行篡改是非常容易的,这样就会造成严重后果. HTTPS和HTTP一样,都是应用层协议.只不过HTTPS在HTTP的基础上又加了一个加密层,保证传输数据的安全性. 下面我们就来探讨一下HTTPS是…

档案八防设备之新型产品多合一恒湿净化一体机

档案馆档案库房用加湿除湿除尘除酸净化一体机【囊括加湿机、除湿机、消毒机、净化机功能】 集成&#xff1a;加湿、除湿、消毒、净化四合一的智能一体机 一、简介 北京盛世宏博科技有限公司档案库房系列加湿除湿除尘除酸净化一体机是档案库房恒湿、和净化式&#xff0c;HB-670…

Oracle数据库中了locked1勒索病毒,用友nchome配置文件损坏该如何解除

随着互联网技术的不断发展&#xff0c;网络安全问题也越来越受到人们的关注。其中&#xff0c;勒索病毒是一种比较常见的网络安全威胁。最近很多集团企业在使用Oracle数据库的过程中&#xff0c;遭遇到了locked1勒索病毒的攻击&#xff0c;导致企业的用友nchome配置文件损坏&am…

Word控件Aspose.Words教程:在 PowerPoint 中使用变形过渡

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

现代 CMake 模块化项目管理指南

文章目录 一、基于CMake&#xff0c;对文件/目录组织规范1.推荐的目录组织方式2.划分子项目3.根项目的 CMakeLists.txt 配置4.子项目的 CMakeLists.txt 配置5.子项目的头文件6.子项目的源文件补充&#xff1a;GLOB 和 GLOB_RECRUSE 的区别7.头文件和源文件的一一对应关系8.只有…

揭秘神秘的JS混淆加密技术

在编程的世界里&#xff0c;沉香舞动着一种强大的力量&#xff0c;就像母亲为了救子不惜一切的决心。而在JavaScript的领域中&#xff0c;我们也有一种神秘的技术&#xff0c;它能够将代码变得晦涩难懂&#xff0c;宛如沉香救母一般&#xff0c;守护着程序的安全。今天&#xf…