leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删除。叶子节点,就是没有子节点的节点。
示例 1:

输入:root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], limit = 1 输出:[1,2,3,4,null,null,7,8,9,null,14]
示例 2:

输入:root = [5,4,8,11,null,17,4,7,1,null,null,5,3], limit = 22 输出:[5,4,8,11,null,17,4,7,null,null,null,5]
示例 3:

输入:root = [1,2,-3,-5,null,4,null], limit = -1 输出:[1,null,-3,4]
方式1.添加一个递归参数 sumPath,表示从根到当前节点的路径和
(O_O)?疑惑:
- ① 叶子节点什么时候能删除?
- ② 非叶子节点若还有儿子未被删除,它能否被删除?
- ③ 非叶子节点的儿子都被删除,意味着什么?
思路和分析:
- ① 对于一个叶子节点(node),从根到这个叶子节点(leaf)的路径仅有一条,那么这条路径的元素和小于limit,就删掉该叶子节点
- ② 对于一个非叶子节点(node),若 node 还有儿子未被删除,那么 node 就不能被删除
- 反证法证明:设把 node 删除,那么经过 node 的所有路径和都小于 limit,这意味着经过 node 的儿子路径和也是小于 limit,那么 node 的儿子也应当被删除,矛盾!故 node 不能被删除
- ③ 对于一个非叶子节点(node)的儿子都被删除,意味着经过 node 的所有儿子的路径和都小于 limit。这等价于经过 node 的所有路径和都小于 limit,故 node 也应当被删除。
- 总结:当且仅当 node 的所有儿子都被删除,才可删除非叶节点 node
算法1:添加一个递归参数 sumPath,表示从根到当前节点的路径和
- ① 如果当前节点是叶子节点(leaf),且此时 sumPath < limit(说明从根到这个叶子节点的路径和小于limit),那么删除这个叶子节点
- ② 如果当前节点是非叶子节点(node),继续往下递归,node的左儿子(为leaf)时且经过 node 的左儿子路径和也是小于limit,就删除这个儿子;node的右儿子(为leaf)时且经过 node 的右儿子路径和也是小于limit,就删除这个儿子;
if(node->left && dfs(node->left,limit,sumPath)==false) { // 左node->left = nullptr;
}
if(node->right && dfs(node->right,limit,sumPath)==false) { // 右node->right = nullptr;
}
- ③ 如果当前节点是非叶子节点(node),且左右儿子都为空,那么就删除 node,返回 false ;否则,返回 true
return node->left || node->right;

C++代码:
class Solution {
public:bool dfs(TreeNode* node,int limit,int sumPath) {sumPath += node->val;if(node->left == node->right) {return sumPath>=limit;} if(node->left && dfs(node->left,limit,sumPath)==false) { // 左node->left = nullptr;}if(node->right && dfs(node->right,limit,sumPath)==false) { // 右node->right = nullptr;}return node->left || node->right;}TreeNode* sufficientSubset(TreeNode* root, int limit) {return dfs(root,limit,0) ?root:nullptr;}
};
① 图解示例一:







② 图解示例三:

方式2.从 limit 中减去当前节点值
- 先比方式1可以少一个参数 sumPath
class Solution {
public:bool dfs(TreeNode* node,int limit) {limit-=node->val;if(node->left == node->right) {return limit>0?false:true;} if(node->left && dfs(node->left,limit)==false) { // 左node->left = nullptr;}if(node->right && dfs(node->right,limit)==false) { // 右node->right = nullptr;}return node->left || node->right;}TreeNode* sufficientSubset(TreeNode* root, int limit) {return dfs(root,limit) ?root:nullptr;}
};
方式3. 从 limit 中减去当前节点值(直接调用 sufficientSubset)
- 如果当前节点是叶子,且此时 limit > 0,说明从根到这个叶子的路径和小于 limit ,那么删除这个叶子
- 如果当前节点不是叶子,那么往下递归,更新它的左儿子为对左儿子调用 sufficientSubset 的结果,更新它的右儿子为对右儿子调用 sufficientSubset 的结果
- 如果左右儿子都为空,那么就删除当前节点,返回空;否则不删,返回当前节点
此段文字来自以下作者
作者:灵茶山艾府
链接:https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/description/

class Solution {
public:TreeNode* sufficientSubset(TreeNode* root, int limit) {limit-=root->val;if(root->left == root->right) { // root 是叶子return limit > 0 ? nullptr : root;} if(root->left) { // 左root->left = sufficientSubset(root->left,limit);}if(root->right) { // 右root->right = sufficientSubset(root->right,limit);}// 如果有儿子没被删除,就不删 root,否则删 rootreturn root->left || root->right ?root:nullptr;}
};
(嘻嘻,仅供参考) 自己又写了一个版本:
class Solution {
public:TreeNode* dfs(TreeNode* node,int limit,int sumPath) {sumPath += node->val;if(node->left == node->right) {return sumPath>=limit? node : nullptr;} if(node->left) { // 左node->left = dfs(node->left,limit,sumPath);}if(node->right) { // 右node->right = dfs(node->right,limit,sumPath);}return node->left || node->right ?node:nullptr;}TreeNode* sufficientSubset(TreeNode* root, int limit) {return dfs(root,limit,0) ? root:nullptr;}
};
参考和推荐文章:
1080. 根到叶路径上的不足节点 - 力扣(LeetCode)
https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2278769/jian-ji-xie-fa-diao-yong-zi-shen-pythonj-64lf/
相关文章:
leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解
给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删除…...
C++基础 -10- 类
类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};...
【软件测试】性能测试相关指标
性能测试 了解性能测试相关指标 1.什么是做性能测试 1.1 生活中遇到的软件性能问题 软件用着用着就不能用了,一看热搜,发现该软件的服务器崩崩溃了。 1.2 性能测试定义 测试人员借助性能测试工具,模拟系统在不同场景下,对应…...
Leetcode 2943. Maximize Area of Square Hole in Grid
Leetcode 2943. Maximize Area of Square Hole in Grid 1. 解题思路2. 代码实现 题目链接:2943. Maximize Area of Square Hole in Grid 1. 解题思路 这一题的话其实横轴和竖轴可以分开来独立考察,因为两者互不影响,我们最终的答案一定是两…...
qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
QHBoxLayout水平布局,QVBoxLayout垂直布局,QFormLayout表单布局管理器,是常用的布局管理器,是用代码编写应用界面必不可少的功能类. 1.tips 这里值得注意的是,2个单选按钮(QRadioButton)同时放进一个水平布局管理器(QHBoxLayout)中,相当于放进了一个分组器中,此时,2个单选按钮…...
springboot中4级配置文件优先级
springboot中4级配置文件优先级...
Python(八十九)函数的参数的内存分析
❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...
西南科技大学C++程序设计实验二(类与对象一)
C++最大的特点就是面向对象,掌握它的几种基本性质还是好理解的,可以看我C++专栏的期末速成,希望对你们学习C++有帮助。 一、实验目的 1.理解简单类的定义、说明与使用 2.理解类中不同属性数据成员的访问特点 3.理解构造函数、析构函数的作用 重点:掌握类的定义与实现,…...
代码随想录二刷 |哈希表 |四数之和
代码随想录二刷 |哈希表 |四数之和 题目描述解题思路 & 代码实现 题目描述 18.四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nu…...
KMP算法【数据结构】
KMP算法 KMP算法是一种改进的字符串匹配算法 Next[j] k :一个用来存放子串返回位置的数组,回溯的位置用字母k来表示。其实就是从匹配失败位置,找到他前面的字符串的最大前后相等子串长度。默认第一个k值为-1(Next[0] -1),第二个k值为0(Next[1] 0),我…...
测开笔记--Typescript: 文件复制到指定目录
开发背景: 自动化开发语言使用的是TypeScript;框架用的是playwright。有个测试脚本需要先将几个文件复制粘贴到新建的项目文件夹下,系统会读取该文件,然后生成页面信息。 关键字:文件复制粘贴; 新建的项目…...
数字滚动vue-count-to
数字滚动 下载插件 npm i vue-count-to 使用 start-val 起始值,表示从什么值开始滚 end-val 终点值,表示要滚到多大值 duration 滚动事件,表示用多长时间来滚动 <countTo :start-val"0" :end-val"228" :duration&quo…...
扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件
推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四ÿ…...
Mysql面试题总结
数据库三大范式是什么 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键&#…...
学习知识随笔(Django)
文章目录 MVC与MTV模型MVCMTV Django目录结构Django请求生命周期流程图路由控制路由是什么路由匹配反向解析路由分发 视图层视图函数语法reqeust对象属性reqeust对象方法 MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M&#…...
基于element自动表格
需求是根据JSON文件生成表格,包含配置和自动props属性以及过滤器; 数据示例: 表格设置: /*** 表格表头信息* chineseToPinYin: 这是封装的根据中文汉字转换为拼音的方法* prop: 表头字段名* filter: 数据过滤器* label: 表头显示…...
Python基础语法之学习数据转换
Python基础语法之学习数据转换 一、代码二、效果 一、代码 #数字转换成字符串 num_str str(11) print(type(num_str))#字符串转整数 numint("11") print(type(num),num)#浮点数转整数 float_num int(11.1) print(type(float_num),float_num)#整数转浮点数 num_flo…...
最新AI创作系统ChatGPT网站运营源码、支持GPT-4-Turbo模型,图片对话识图理解,支持DALL-E3文生图
一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!本系统使用NestjsVueTypescript框架技术,持续集成AI能力到本系统。支持OpenAI DALL-E3文生图,…...
Kotlin中常见的List使用
文章目录 1.filter2.map3.count4.first,last5.any,all,none6.find,findLast7.indexOf()和lastIndexOf()查找元素下标8.Slice切片9.Take()和drop()获取指定长度 1.filter filter 就像其本意一样,可以通过 filter 对 Kotlin list 进行过滤。 fun main() …...
汽车电子 -- 车载ADAS之LCA(变道辅助系统)
相关法规文件: LCA: ISO 17387-2008 Intelligent transport systems — Lane change decision aid systems 一、变道辅助系统 LCA (Lane Change Assist) LCA 系统(变道辅助系统)监测后方相邻车道区域,如果有车辆在后…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
