二叉树题目:根到叶路径上的不足结点

news2024/11/29 7:57:37

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:根到叶路径上的不足结点

出处:1080. 根到叶路径上的不足结点

难度

6 级

题目描述

要求

给定二叉树的根结点 root \texttt{root} root 和整数 limit \texttt{limit} limit,同时删除树中的所有不足结点,然后返回结果二叉树的根结点。

如果经过一个结点的所有根到叶路径都满足路径上的结点值总和严格小于 limit \texttt{limit} limit,则该结点是不足结点

示例

示例 1:

示例 1

输入: root   =   [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14],   limit   =   1 \texttt{root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], 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] \texttt{[1,2,3,4,null,null,7,8,9,null,14]} [1,2,3,4,null,null,7,8,9,null,14]

示例 2:

示例 2

输入: root   =   [5,4,8,11,null,17,4,7,1,null,null,5,3],   limit   =   22 \texttt{root = [5,4,8,11,null,17,4,7,1,null,null,5,3], limit = 22} 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] \texttt{[5,4,8,11,null,17,4,7,null,null,null,5]} [5,4,8,11,null,17,4,7,null,null,null,5]

示例 3:

示例 3

输入: root   =   [1,2,-3,-5,null,4,null],   limit   =   -1 \texttt{root = [1,2,-3,-5,null,4,null], limit = -1} root = [1,2,-3,-5,null,4,null], limit = -1
输出: [1,null,-3,4] \texttt{[1,null,-3,4]} [1,null,-3,4]

数据范围

  • 树中结点数目在范围 [1,   5000] \texttt{[1, 5000]} [1, 5000]
  • -10 5 ≤ Node.val ≤ 10 5 \texttt{-10}^\texttt{5} \le \texttt{Node.val} \le \texttt{10}^\texttt{5} -105Node.val105
  • -10 9 ≤ limit ≤ 10 9 \texttt{-10}^\texttt{9} \le \texttt{limit} \le \texttt{10}^\texttt{9} -109limit109

解法

思路和算法

这道题要求同时删除二叉树中的所有不足结点。「同时」的含义是不会因为有结点被删除而改变根到叶路径上的结点值总和,只要遵循该规则,即可从叶结点开始依次删除结点。

由于这道题需要计算根到叶路径上的结点值总和,因此可以使用深度优先搜索实现。深度优先搜索的过程中,对于每个结点都可以计算从根结点到当前结点的路径上的结点值总和(结点值总和不包括当前结点),并更新 limit \textit{limit} limit,只有当从当前结点到叶结点的路径上的结点值总和大于等于更新后的 limit \textit{limit} limit 时,从根结点到叶结点的路径上的结点值总和才大于等于原始的 limit \textit{limit} limit。因此,可以在深度优先搜索的过程中对于每个结点维护当前结点剩余的 limit \textit{limit} limit,根结点剩余的 limit \textit{limit} limit 即为原始的 limit \textit{limit} limit,根结点的子结点剩余的 limit \textit{limit} limit 为原始的 limit \textit{limit} limit 与根结点值之差。

根据定义,经过不足结点的所有根到叶路径都满足路径上的结点值总和严格小于 limit \textit{limit} limit。由于每个叶结点都只有一条路径经过,因此首先对叶结点执行删除不足结点的操作。对于叶结点,如果其结点值严格小于剩余的 limit \textit{limit} limit,则删除当前结点。

对于非叶结点,对其每个非空子树递归地删除不足结点。如果在对当前结点的非空子树删除不足结点之后,当前结点变成叶结点,则经过当前结点的所有根到叶路径都满足路径上的结点值总和严格小于 limit \textit{limit} limit,因此当前结点是不足结点,删除当前结点。

遍历结束之后,二叉树中的所有不足结点都被删除,返回删除不足结点之后的二叉树。

代码

class Solution {
    public TreeNode sufficientSubset(TreeNode root, int limit) {
        return dfs(root, limit);
    }

    public TreeNode dfs(TreeNode node, int limit) {
        TreeNode left = node.left, right = node.right;
        if (left == null && right == null) {
            return node.val >= limit ? node : null;
        }
        limit -= node.val;
        if (left != null) {
            node.left = dfs(left, limit);
        }
        if (right != null) {
            node.right = dfs(right, limit);
        }
        if (node.left == null && node.right == null) {
            return null;
        }
        return node;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下是 O ( n ) O(n) O(n)

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

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

相关文章

C语言之sizeof详解,5点透析,帮你真正了解它

今天也要继续坚持 前言 今天复习C语言了解到不少和她有关的知识,才知道之前对他了解甚少,于是写下博客及时记录自己的所得,与大家分享一下 第一点:sizeof不是函数 sizeof是一个关键字而不是函数!是的,他…

【AIGC矢量风格】黑色和白色一系列物体

基于矢量风格的一组画面: 矢量风格是海报设计中常见的一种风格,它主要使用矢量图形进行设计。矢量图形是由数学公式定义的图形,其特点是可以在不失去清晰度的情况下进行任意缩放,无论图形尺寸如何变化,都不会失真或模糊…

猫咪训练的方法指南,新手养猫的攻略大全

一、教程描述 本套教程可以教你学会养猫,让您快速成长为养猫专家。视频教程是猫咪基础训练,共有7个视频,电子书教程是养猫攻略大全,共有11本,包括爱猫养护实用手册,全世界250多种猫的彩色图鉴,…

解密C++中的forward<int>(a)和forward<int >(a):你真的了解它们之间的区别吗?

一文看尽C中的forward完美转发 一、前言二、深入理解forward和完美转发三、对forward<int>(a)的解析四、对forward<int &&>(a)的解析五、forward<int>(a)和forward<int &&>(a)的区别总结 一、前言 完美转发在C中具有重要性&#xff0…

kafka 的零拷贝原理

文章目录 kafka 的零拷贝原理 今天来跟大家聊聊kafka的零拷贝原理是什么&#xff1f; kafka 的零拷贝原理 零拷贝是一种减少数据拷贝的机制&#xff0c;能够有效提升数据的效率&#xff1b;   在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上…

zlib.decompressFile报错 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…

1. 私有云实战之基础环境搭建

文章目录 服务器搭建准备基础环境介绍展示效果iKuai展示效果iStroreOS展示效果ESXI展示效果群辉展示效果JumpServer展示kubesphere展示 环境搭建ESXI系统安装及基础网络环境配置ESXI系统安装基础网络环境配置配置虚拟交换机配置端口组 ESXI中虚拟机安装 ikuai安装及配置ikuai安…

C# PrinterSettings修改打印机纸张类型,paperType

需求&#xff1a;直接上图&#xff0c;PrinterSettings只能改变纸张大小&#xff0c;打印质量&#xff0c;无法更改打印纸类型 爱普生打印机打印照片已经设置了最高质量&#xff0c;打印图片仍不清晰&#xff0c;需要修改打印纸类型&#xff0c;使用PrintDialog调出对话框&…

普中STM32-PZ6806L开发板(HAL库函数实现-7段共阳数码管数字显示)

简介 通过操作GPIO输出电平实现驱动单个共阳数码管 0 ~ F的显示。电路原理图 数码管电路原理图 数码管与主芯片电路原理图 其他知识 1. 由原理图可知, 共阳极已接VCC, 所以只需要控制GPIO输出低电平就可以点亮7 . 的数码管了. 2. 驱动管与主芯片引脚对应关系A -> PC0…

Python学习笔记之(一)搭建Python 环境

搭建Python 环境 1. 使用工具准备1.1 Python 安装1.1.1 下载Python 安装包1.1.2 安装Python 1.2 VScode 安装1.2.1 下载VScode安装包1.2.2 给VScode安装Python 扩展 2. 第一次编写Python 程序 本篇文章以Windows 系统为例。 1. 使用工具准备 1.1 Python 安装 1.1.1 下载Pytho…

Java多线程之线程池,volatile,悲观锁,乐观锁,并发工具类

目录 1.线程池核心原理1.创建线程池2.任务拒绝策略3.自定义线程池 2.线程池的大小1.最大并行数2.影响线程池大小的因素 3.多线程常见考点&#xff08;volatile&#xff0c;悲观锁&#xff0c;乐观锁&#xff09;4.并发工具类 1.线程池核心原理 ①创建一个空的池子 ②提交任务时…

印象笔记01:初识印象笔记

印象笔记01&#xff1a;初识印象笔记 印象笔记是一个历史比较久的笔记软件&#xff0c;近几年营销渠道不断完善&#xff0c;软件生态也日渐健全。个人因为很早接触印象笔记&#xff0c;从有道云笔记转粉到印象笔记了&#xff08;2017 年&#xff09;。而且在前几年一下子开了十…

图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 上篇内容&#xff1a; Unet系列算法 下篇内容&#xff1a; unet医学细胞分割实战2 1、医学细胞数据…

vite+Vue3学习笔记(3)——界面设计

1 Element-plus 这是一个基于Vue3的组件库&#xff0c;能够快速构建界面样式。 官网链接&#xff1a; https://element-plus.gitee.io/zh-CN/guide/design.html 1.1 基础组件 1.1.1 安装 项目中的终端输入&#xff1a; npm install --save element-plus 1.1.2 引用 1.1.2.1…

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面 Hello大家好&#xff0c;今日是2024年的第一天&#xff0c;祝大家元旦快乐&#x1f389; 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用&#xff1f;三、日志怎么用&#xff1f;四、自定义日志打印&#x1f4ac; 常见日志框架说明4.1 在程序…

打印菱形和金字塔类型(总结)

首先&#xff0c;在之前的学习中&#xff0c;我们了解了菱形的打印&#xff0c;今天我们来对金字塔和菱形这类打印图形的问题&#xff0c;我们来做一个总结。 这个总结的来源是这今天做了一道题 这道题的答案如下 这个题做起来并不难&#xff0c;拓展到这类问题中&#xff0c;…

Java智慧工地管理平台系统源码带APP端源码

智慧工地将“互联网”的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度地收集人员、安全、环境、材料等关键业务数据&#xff0c;依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&a…

PTA——计算火车运行时间

本题要求根据火车的出发时间和达到时间&#xff0c;编写程序计算整个旅途所用的时间。 输入格式&#xff1a; 输入在一行中给出2个4位正整数&#xff0c;其间以空格分隔&#xff0c;分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数&#xff08;00-23&#xff0…

JavaScript:BOM操作

JavaScript&#xff1a;BOM操作 BOM与JavaScript的关系window对象window对象的常用属性方法定时器间歇函数延时函数 JavaScript执行机制同步异步事件循环 location对象navigator对象histroy对象浏览器的本地存储localStoragesessionStorage 复杂数据类型的存储JSON字符串 BOM与…

浅谈Verilog代码的执行顺序

一、组合逻辑和时序逻辑 数字电路可以分成两大类&#xff0c;一类叫组合逻辑电路&#xff0c;另一类叫做时序逻辑电路。 组合逻辑电路&#xff1a;由门电路组成&#xff0c;其某一时刻的输出状态只与该时刻的输入状态有关&#xff0c;而与电路原来的状态无关&#xff0c;并没有…