leetCode 1080.根到叶路径上的不足节点 + 递归 + 图解

news2024/11/27 18:34:39

给你二叉树的根节点 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,否则删 root
        return root->left || root->right ?root:nullptr;
    }
};

参考和推荐文章:

1080. 根到叶路径上的不足节点 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2278769/jian-ji-xie-fa-diao-yong-zi-shen-pythonj-64lf/

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

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

相关文章

养生馆服务预约会员管理系统小程序效果如何

中医养生馆的全国数量逐渐增加&#xff0c;各种疾病困扰下&#xff0c;有些病往往通过养生馆即可治好&#xff0c;比如常见的针灸、按摩、药理滋补、切脉等&#xff0c;都有很高的市场需求度&#xff0c;而随着众多商家入局赛道及消费升级&#xff0c;传统中医养生馆经营痛点也…

【C++】哈希(位图、布隆过滤器)

一、哈希的应用&#xff08;位图和布隆过滤器&#xff09; 1、位图&#xff08;bitset&#xff09; &#xff08;1&#xff09;位图概念 【题目】 给 40亿 个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40亿 个数中。…

电源的纹波

电源纹波的产生 我们常见的电源有线性电源和开关电源&#xff0c;它们输出的直流电压是由交流电压经整流、滤波、稳压后得到的。由于滤波不干净&#xff0c;直流电平之上就会附着包含周期性与随机性成分的杂波信号&#xff0c;这就产生了纹波。 在额定输出电压、电流的情况下…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)二

七、Shell Here String&#xff08;内嵌字符串&#xff0c;嵌入式字符串&#xff09; Here String 是《六、Shell Here Document&#xff08;内嵌文档/立即文档&#xff09;》的一个变种&#xff0c;它的用法如下&#xff1a; command <<< string command 是 Shell 命…

指定训练使用的GPU个数,没有指定定gpu id,训练在其中两个gpu上执行,但是线程id分布在所有4个gpu上,为什么?如何解决?

目录 问题背景 1 线程id分布在所有gpu&#xff08;包括未启用的gpu&#xff09;上原因&#xff1a; 2 在解决这个问题时&#xff0c;可以采取以下步骤&#xff1a; 3 修正深度学习框架默认使用所有可见 GPU 的问题 1 TensorFlow&#xff1a; 2 PyTorch&#xff1a; 3 K…

【【Linux编程介绍之关键配置和常用用法】】

Linux编程介绍之关键配置和常用用法 Hello World ! 我们所说的编写代码包括两部分&#xff1a;代码编写和编译&#xff0c;在Windows下可以使用Visual Studio来完成这两部&#xff0c;可以在 Visual Studio 下编写代码然后直接点击编译就可以了。但是在 Linux 下这两部分是分开…

13年老鸟总结,性能测试方法汇总+性能响应很慢排查方法(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试包含哪…

智能优化算法应用:基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于麻雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.麻雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

火锅店管理系统外卖点餐配送小程序的效果

火锅是餐饮行业重要的组成部分&#xff0c;在每个地方都受到追捧&#xff0c;其从业商家众多&#xff0c;头部连锁品牌也不少&#xff0c;近些年行业市场规模也一直增加&#xff0c;而随着消费升级及数字化转型&#xff0c;传统火锅店经营痛点不少&#xff1a; 火锅店的需求非…

Unsupervised MVS论文笔记(2019年)

Unsupervised MVS论文笔记&#xff08;2019年&#xff09; 摘要1 引言2 相关工作3 实现方法3.1 网络架构3.2 通过光度一致性学习3.3 MVS的鲁棒光度一致性3.4 学习设置和实施的细节3.5.预测每幅图像的深度图 4 实验4.1 在DTU上的结果4.2 消融实验4.3 在ETH3D数据集上的微调4.4 在…

三轴加速度计LIS2DW12开发(1)----轮询获取加速度数据

STM32WB55开发.6--FUS更新 概述视频教学通信模式管脚定义IIC通信模式速率生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置传感器的量程配置过滤器链配置电源模式设置输出数据速率轮询获取加速度演示 概述 本文将介绍如何驱…

智能优化算法应用:基于粒子群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于粒子群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于粒子群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.粒子群算法4.实验参数设定5.算法结果6.参考文献7.…

烧烤店点餐外卖配送管理小程序作用如何

烧烤是人们爱吃的食品之一&#xff0c;尤其到了晚上商业小吃街&#xff0c;烧烤店里往往是坐满了人&#xff0c;甚至还有排队的&#xff0c;从业商家众多&#xff0c;足可见该餐饮细分领域在市场中的欢迎程度。 而在实际经营中&#xff0c;烧烤店经营痛点也不小。 随着互联网…

注意力机制(Attention Mechanism)

目录 1. 简介&#xff1a;探索注意力机制的世界 2. 历史背景 3. 核心原理 4. 应用案例 5. 技术挑战与未来趋势 6. 图表和示例 7. Conclusion 1. 简介&#xff1a;探索注意力机制的世界 在当今的人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;…

Linux内核--内存管理(一)任务空间管理

目录 一、引言 二、基本概念梳理 三、用户态进程内存管理 ------>3.1、用户态 ------>3.2、内核态 ------>3.3、内存管理结构 ------>3.4、mm_struct ------>4.5、vm_area_struct 四、内核态结构 ------>4.1、32位内核态结构 ------>4.2、64位…

vue3+ts 兄弟组件之间传值

父级&#xff1a; <template><div><!-- <A on-click"getFlag"></A><B :flag"Flag"></B> --><A></A><B></B></div> </template><script setup lang"ts"> i…

【教学类-06-12】20231126 (一)二位数 如何让加减乘除题目从小到大排序(以1-20之间加法为例,做正序排列用)

结果展示 优化后 优化前 背景需求&#xff1a; 生成列表 单独抽取显示题目排序方法 存在问题: 我希望 00 01 02……这样排序&#xff0c;但是实际上&#xff0c;除了第一个加数会从小到大排序&#xff0c;第二个被加数的第十位数和个位数都会从小到大排序&#xff0c;也就是…

【电路笔记】-快速了电阻

电阻类型 文章目录 电阻类型1、概述2、电阻器的组成类型2.1 碳电阻器2.2 薄膜电阻器2.3 绕线电阻器 3、总结 电阻器是所有电子元件中最基本、最常用的元件&#xff0c;人们几乎认为电阻器是理所当然的&#xff0c;但它们在电路中起着至关重要的作用。 1、概述 有许多不同类型的…

2018年2月26日 Go生态洞察:2017年Go用户调查结果分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

使用JS脚本刷点击率

使用JS脚本刷点击率 1.使用谷歌浏览器&#xff0c;登录国开平台&#xff0c;打开《管理学基础》课程导学的“学什么”&#xff0c;保证看得到右下角的“下一个”&#xff0c;然后在“下一个”右键点检查。 2.复制以下JS代码&#xff0c;在右上角“Console”标签&#xff08;…