【算法】【二叉树,DFS,哈希集合,分类讨论】力扣1110. 删点成林

1110. 删点成林

文章目录

  • 【算法】力扣【二叉树,DFS,哈希集合,分类讨论】1110. 删点成林
    • 题目描述
      • 示例 1:
      • 示例 2:
    • 输入输出示例解释
    • 思路解析
      • 核心思想
      • 算法步骤
      • 复杂度分析
    • 代码实现
    • 总结


【算法】力扣【二叉树,DFS,哈希集合,分类讨论】1110. 删点成林

题目描述

给出二叉树的根节点 root,树上每个节点都有一个不同的值。如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。返回森林中的每棵树。你可以按任意顺序组织答案。

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]

输出:[[1,2,null,4],[6],[7]]

解释:

  • 节点3被删除后,子节点6和7成为新的树的根节点。
  • 节点5被删除后,子节点4成为新的树的根节点。

示例 2:

输入:root = [1,2,4,null,3], to_delete = [3]

输出:[[1,2,4]]

解释:

  • 节点3被删除后,没有新的树产生,剩余的树仍然是[1,2,4]

输入输出示例解释

  • 输入:
    • root为二叉树的根节点
    • to_delete为需要删除的节点值的列表
  • 输出:
    • 森林中每棵树的根节点列表

思路解析

核心思想

我们需要遍历二叉树,判断每个节点是否需要被删除。根据分类讨论:

  1. 如果当前节点需要被删除:

    • 移除当前节点与父节点的连接
    • 递归处理其左右子树
  2. 如果当前节点不需要被删除:

    • 如果父节点被删除,则当前节点是新树的根节点,加入结果集
    • 递归处理其左右子树

算法步骤

  1. 初始化:将to_delete列表转化为集合,方便O(1)时间复杂度判断。
  2. 深度优先搜索(DFS)
    • 递归遍历二叉树。
    • 根据当前节点是否需要删除,决定是否断开与父节点的连接。
    • 根据父节点是否被删除,判断当前节点是否为新树的根节点。
  3. 返回结果:最终返回森林中的所有树的根节点。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为二叉树的节点数,每个节点遍历一次。
  • 空间复杂度: O ( n ) O(n) O(n),递归调用栈的深度为树的高度,最坏情况下为 O ( n ) O(n) O(n)

代码实现

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def delNodes(self, root: Optional[TreeNode], to_delete: List[int]) -> List[TreeNode]:
        
        """
        遍历二叉树在所难免,每个节点非删即不删,因此,我们先从分类讨论开始思考。

        如果当前节点要被删除,则:
            移除当前节点与上一个节点的连接

        否则:
            检查上一个节点是否被删除:
                如果上一个节点被删除,那么当前节点就是森林中的一棵树的根节点。
                否则,当前节点就不是根节点
        """
        
        def dfs(fa: TreeNode, node: TreeNode, is_del: bool):
            if node is None:
                return
            
            # 保留父节点是否需要被删除这一信息
            fa_is_del = is_del
            
            # 获取当前节点是否需要被删除这一信息
            is_del = node.val in to_delete

            if is_del:
                # 如果当前节点需要删除,则断开与其父节点的连接
                if node == fa.left:
                    fa.left = None
                elif node == fa.right:
                    fa.right = None
            else:
                # 否则,根据父节点是否被删除,确定当前节点是否为一个子树的根节点
                if fa_is_del:
                    # 父节点被删除,当前节点是根节点
                    ans.append(node)
            
            # 递归遍历左右子树
            dfs(node, node.left, is_del)
            dfs(node, node.right, is_del)

        ans = []
        to_delete = set(to_delete)  # 转为哈希集合,以O(1)的时间判断每个节点是否需要删除。
        
        # 特殊情况:如果根节点不为空且根节点不在删除列表中,需要将根节点作为结果的一部分
        if root and root.val not in to_delete:
            ans.append(root)
        
        dfs(TreeNode(), root, True)
        
        return ans

总结

本题通过DFS遍历二叉树,结合分类讨论的方法,逐步删除指定节点并生成新的森林。该算法有效地处理了节点删除后树结构的调整问题,并通过哈希集合优化删除判断的时间复杂度,最终实现了高效的解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑卸载linux安装windows后每次开机都出现grub

原因分析 这是因为电脑硬盘中还存在linux系统的引导程序,并且启动顺序还在windows之前,有时候通过bios根本找不到它的存在,以至于每次windows开机出现grub之后都要输入exit退出linux的引导之后才能使得电脑进入windows,这个有时会…

跟着Kimi学习结构化提示词:19套内置提示词都在这里了!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

计算机毕业设计 | springboot药品库存追踪与管理系统 药店管理(附源码)

1,绪论 1.1 背景调研 如今药品调价频繁,且品种繁多,增加了药品销售定价的难度。药品来货验收登记中的审查有效期环节容易出错,错收过期或有效期不足的药品。 手工模式下的药品库存难以及时掌握,虽然采取了每日进行缺…

数据库小项目——叮叮移动业务大厅(三层架构+MySQL数据库)

源码已上传至资源 该项目主要使用技术为MySQL数据库,其中也包含了一些对于文件的写入和读取操作。项目结构采用三层架构,后端的业务逻辑清晰明了。 1.项目结构 项目采用控制台版,前端业务在java包下,每个业务单独成块。若想要GUI…

Day05-Grafana的基本应用与配置

Day05-Grafana的基本应用与配置 1. Grafana概述2. Grafana实战2.1 环境准备2.2 使用流程1)部署grafana 9.3.62)web页面访问3)配置zbx插件4)配置grafana的数据源5)web: Grafana web页面添加与配置图形dashboard,仪表盘6…

linux命令中arj使用

arj 用于创建和管理.arj压缩包 补充说明 arj命令 是 .arj 格式的压缩文件的管理器,用于创建和管理 .arj 压缩包。 语法 arj(参数)参数 操作指令:对 .arj 压缩包执行的操作指令;压缩包名称:指定要操作的arj压缩包名称。 更多…

【投稿资讯】区块链会议CCF A -- SP 2025 截止6.6、11.14 附录用率

会议名称:46th IEEE Symposium on Security and Privacy( S&P) CCF等级:CCF A类学术会议 类别:网络与信息安全 录用率:2023年 195/1147,2024年录用了17篇和区块链相关的论文 Topics of interest inc…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目: 题解: struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

uview1.0 u-form表单回显校验不通过

提交到后端的数据,回显后不做任何修改无法通过表单校验 原因,u-form表单校验的类型默认为string,但是后端返回的是integer类型,导致无法通过校验 解决,既然后端返回的是整数形,那么我们就将校验规则的type…

[机缘参悟-185] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -8- 认知觉醒 - 逻辑谬误、认知偏差:幸存者偏差

目录 前言: 一、幸存者偏差 二、幸存者偏差在现实中的应用 第一个故事: 第二个故事: 三、生活中的幸存者偏差 四、迷恋成功者经验的原因:鸡汤、幻想、传奇、希望 备注: 前言: 幸存者偏差&#xff0…

Backend - 数据分析 matplotlib

目录 一、作用 二、安装环境 (一)虚拟环境终端 (二)代码导入库 (三)设置中文 1. 使用window自带(推荐) 2. 下载字体 三、应用 (一)基础知识 1. plt…

Spring Cloud Alibaba-07-RocketMQ消息驱动

Lison <dreamlison163.com>, v1.0.0, 2024.4.20 Spring Cloud Alibaba-07-RocketMQ消息驱动 文章目录 Spring Cloud Alibaba-07-RocketMQ消息驱动MQ简介MQ的应用场景常见的MQ产品RocketeMQ的架构及概念 RocketMQ入门RocketMQ环境搭建 SpringBoot 集成 RocketMQ MQ简介 …

汐鹤Key码查询,网站授权系统源码

汐鹤Key码查询和网站授权系统源码主要用于特殊虚拟物品销售商家。 下 载 地 址 &#xff1a; runruncode.com/php/19770.html 附带插件功能&#xff08;网站授权&#xff09;&#xff0c;但目前开发内容较少&#xff0c;请谅解&#xff01;同时&#xff0c;代码优化空间很大…

【论文极速读】 LLava: 指令跟随的多模态大语言模型

【论文极速读】 LLava: 指令跟随的多模态大语言模型 FesianXu 20240331 at Tencent WeChat Search Team 前言 如何将已预训练好的大规模语言模型&#xff08;LLM&#xff09;和多模态模型&#xff08;如CLIP&#xff09;进行融合&#xff0c;形成一个多模态大语言模型&#xf…

Ubuntu环境|FileNotFoundError: [Errno 2] No such file or directory: ‘soundstretch‘

一 问题描述 二 问题解决 使用ubuntu命令安装soundstretch&#xff08;How To Install soundstretch on Ubuntu 20.04 | Installati.one&#xff09; sudo apt -y install soundstretch 安装完成&#xff0c;问题解决。

yolov8实战第九天——pyqt5-yolov8实现道路病害识别系统(参考论文(6000+字)+环境配置+完整部署代码+代码使用说明+训练好的模型+数据集)

基于 pyqt5-yolov8实现道路病害识别系统,包括图片、批量图片、视频、视频流的道路病害识别。包括病害历史记录栏显示,训练好的模型和数据集,可直接进行工程应用和论文书写。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(批量图片检测,检测到的内容添加…

pod install 报错 ‘SDK does not contain ‘libarclite‘ at the path...‘

报错内容&#xff1a; SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a’; 这是报错已经很明确告诉我们&#xff0c;Xcode默认的工具链中缺少一个工具…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中&#xff0c;显示数据的方式多种多样&#xff0c;直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件&#xff0c;该控件可以通过动画展示评分的变化&#xff0c;让应用界面更加生动。 实现思…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件&#xff0c;给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

【工具使用】搜狗输入法如何输入希腊字母等特殊字符

步骤&#xff1a; 1&#xff0c;点击悬浮框的输入方式&#xff0c;选择“符号大全”&#xff1a; 2&#xff0c;根据自己需要选择对应的符号即可&#xff1a;