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

2023-11-06

作者:小迅
链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 链栈之C++实现

    链栈是借用单链表实现的栈 其不同于顺序栈之处在于 1 链栈的空间是程序运行期间根据需要动态分配的 机器内存是它的上限 而顺序栈则是 静态分配内存的 2 链栈动态分配内存的特性使得它一般无需考虑栈溢出的问题 链栈的的组织结构如下图所示 容易发
  • 2021-11-06 液位控制滤波

    1 原文连接 我用 CSDN 这个app发现了有技术含量的博客 小伙伴们求同去 液位控制 一起来围观吧 https blog csdn net weixin 34405557 article details 93934030 utm sou
  • 请谈谈你对云计算的理解

    一 请谈谈你对云计算的理解 1 云计算产生的背景 随着并行计算 分布计算 网格计算 虚拟化 SOA 容错技术 网络带宽等关键技术日趋成熟 通过网络访问非本地的计算服务 包括数据处理 存储和信息服务等 的条件越来越成熟 多种技术的融合就产生了
  • img 图片固定大小 图片不糊 object-fit

    div h2 object fit fill h2 img src https interactive examples mdn mozilla net media examples plumeria jpg alt MDN Logo cl
  • Windows 无法验证此设备所需的驱动程序的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。(代码52)...

    由未签名驱动导致的键鼠装无法使用的问题 usb 问题失效 要是win 10的话 导致的结果就是 无线键鼠套装无法使用 解决办法是 1 按下shift 按键 点击重启按钮 重启后 2 疑难解答 gt 启动 gt f7 禁用未签名强制验证 3
  • chatgpt提问示例指南

    担任雅思写作考官 我希望你假定自己是雅思写作考官 根据雅思评判标准 按我给你的雅思考题和对应答案给我评分 并且按照雅思写作评分细则给出打分依据 此外 请给我详细的修改意见并写出满分范文 第一个问题是 It is sometimes argu
  • RHCE第五次作业

    1 总结变量的类型及含义 2 实现课堂案例计算长方形面积 6种方式 3 定义变量url https blog csdn net weixin 45029822 article details 103568815 通过多种方法实现 1 截取网
  • 2-2-7 React 几个用Hooks的小技巧

    1 Hooks 控制流 if useEffect gt Hooks是对行为的声明 if else 是分支控制 不是声明的一部分 从理论上不应该有声明在控制流之下 在React内部通过Hooks的词法顺序来区分不同的Hook 2 Stacko
  • 在PyCharm上安装TENSORFLOW

    上周联系了一下南科大的老师 老师比较和蔼可亲 安排我先学习一下MNIST数据集进行深度学习方向图像识别的入门 本来上周应该要完成的但还是因为搭建平台 学校实训等各方面原因 没能及时完成 特别是在想用pycharm用来安装tensorflow
  • 台式计算机怎么连接蓝牙 win10,win10台式电脑蓝牙怎么开启(开启电脑蓝牙的步骤图)...

    原标题 win10台式电脑蓝牙怎么开启 开启电脑蓝牙的步骤图 虽然WiFi无线连接现在是主流 但蓝牙无线连接仍然以独特的优势得以在许多设备中保留 例如Win10动态锁自动锁定功能就是利用电脑与手机的蓝牙连接实现的 下面MS酋长就来分享一下W
  • 找回微信聊天记录-unbaksdpak解包软件图文教程

    前几天用小米助手备份恢复后微信聊天记录丢失 上网找资料搞鼓了一天终于找回了聊天记录 在上个分享帖子里有详细介绍了找回过程 但有机友某些步骤看不懂 要我再出个图文教程 我想主要应该是GitHub上的解包软件不会用吧 这次主要讲一下unbaks
  • 3分钟入门:Blob 对象的了解与创建

    Blob 对象 Blob 英文全称 binary large object 是指二进制类型大对象 Blob 对象表示不可变的 类似文件对象的原始数据 即它是类似文件对象的二进制数据 可以像操作 File 对象一样操作 Blob 对象 但话又
  • Python入门——第一章 python编程基础

    Python入门 文章目录 Python入门 第一章 python编程基础 1 1 基本输入输出 1 1 1使用print 函数进行简单输出 chr 函数 print 输出到指定文件 print 输出年份 月份 日期 1 1 2使用prin
  • 给定一个整数,判断它能否被3,5,7整除,并输出以下信息:

    1 能同时被3 5 7整除 直接输出3 5 7 每个数中间一个空格 2 只能被其中两个数整除 输出两个数 小的在前 大的在后 例如 3 5或者3 7或者5 7 中间用空格分隔 ififa 3 只能被其中一个数整除 输出这个除数 4 不能被任
  • ESP32学习笔记(七) 复位和时钟

    ESP32学习笔记 七 复位和时钟 目录 ESP32学习笔记 一 芯片型号介绍 ESP32学习笔记 二 开发环境搭建 VSCode platformio ESP32学习笔记 三 硬件资源介绍 ESP32学习笔记 四 串口通信 ESP32学习
  • FFMPEG常用的一些命令介绍:音频录制、视频录制

    1 视频和音频单独抓取 如果指定输入格式和设备 则ffmpeg可以直接捕获视频和音频 Linux下捕获摄像头的数据保存成视频文件 ffmpeg f video4linux2 s 1280x720 i dev video0 test mp4
  • [从零开始学习FPGA编程-31]:进阶篇 - 基本时序电路-RS触发器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 基本RS触发器 1 1 概述 1 2 R
  • Linux安装go环境

    Linux安装go环境 安装go需要以下步骤 安装go需要以下步骤 下载安装包 到官网 https golang org dl 下载安装包 选择对应的操作系统和架构 比如Linux的64位系统可以选择 gox x x linux amd64
  • C语言_字符串拼接函数strcat使用及实现

    字符串拼接函数strcat 01 字符串拼接函数strcat函数原型 char strcat char dest const char src 作用 把src所指向的字符串 包括 0 复制到dest所指向的字符串后面 删除 dest原来末尾
  • LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

    作者 小迅 链接 https leetcode cn problems insufficient nodes in root to leaf paths solutions 2279048 di gui zhu shi chao ji xi