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

news2024/11/26 6:58:11

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.coloradmin.cn/o/1708956.html

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

相关文章

软件程序设计规范(代码编写规范文档)-word下载

程序的编码是一个创造性极强的工作,必须要遵守一定的规则和限制,编码风格的重要性对软件项目开发来说是不言而喻的。 开发工程师在开发过程中必须遵守本规范,规范是代码编写及代码验收等管理环节中必须执行的标准。 编制基本原则:…

json/excel文件上传下载工具方法汇总

文章目录 浏览器下载json文件浏览器下载excel文件【Workbook】浏览器导入json文件【ObjectMapper】浏览器导入excel文件【Workbook】ResourceLoader读取类路径下单个jsonResourceLoader读取类路径下所有json文件 浏览器下载json文件 Operation(summary "设备模型导出(带分…

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

鲜花门店小程序开发流程:详细教程,让你轻松掌握

想要开发一款专属于自己鲜花门店的小程序吗?不知道从何开始?别担心,本文将为你提供详细的开发流程,帮助你轻松掌握。 1. 注册登录乔拓云网并进入操作后台 首先,你需要注册并登录乔拓云网,然后进入操作后台…

系统开发与运行知识

系统开发与运行知识 导航 文章目录 系统开发与运行知识导航一、软件工程二、软件生命周期三、开发模型四、开发方法五、需求分析结构化分析 六、数据流图分层数据流图的画法设计注意事项 七、数据字典数据字典的内容 八、系统设计九、结构化设计常用工具十、面向对象十一、UML…

集合的创建

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python中的集合同数学中的集合概念类似,也是用于保存不重复元素的。它有可变集合(set)和不可变集合(f…

Vue3实战笔记(34)—完美的菜单组件封装

文章目录 前言多层菜单封装总结 前言 之前简单的封装了一下菜单组件,数据都是写死的,多层嵌套没有支持,学完了组件传值,计算属性就可以继续完善了。 多层菜单封装 先看下数据结构: {"id":"1",&q…

K210 数字识别 笔记

一、烧写固件 连接k210开发板,点开烧录固件工具,选中固件,并下载 二、模型训练 网站:MaixHub 1、上传文件 2、开始标记数据 添加9个标签,命名为1~9,按键盘w开始标记,键盘D可以下一张图片&…

Redis学习篇2:Redis在Spring中的应用

本文继上文开始讲述了Redis在IDEA中如何应用以及集成进入spring开发环境,以及如何使用Redis客户端。上一个文章:Redis学习篇1:初识Redishttps://blog.csdn.net/jialuosi/article/details/139057088 一、Redis在java中的客户端 二、SpringDat…

Spring Boot中@Value加载配置的替代者:@ConfigurationProperties

Value注解Spring Boot开发者都已经熟悉了,通过该注解,我们可以快速的把配置信息加载到Spring的Bean中。 例如:在application.yml中添加了一个配置如下: 我想在service中获取name,通过value注解方式实现,代…

【JVM精通之路】垃圾回收-三色标记算法

首先预期你已经基本了解垃圾回收的相关知识,包括新生代垃圾回收器,老年代垃圾回收器,以及他们的算法,可达性分析等等。 先想象一个场景 最开始黑色节点是GC-Roots的根节点,这些对象有这样的特点因此被选为垃圾回收的根…

你什么时候感觉学明白Java了?

学是学不明白Java的,要学明白Java,一定只能在工作以后。 1 在学习阶段,哪怕是借鉴别人的学习路线,其实依然会学很多不必要的技能,比如jsp,swing,或者多线程,或者设计模式。 2 或者…

你对仲裁裁决不服怎么办?我教你四个狠招!

你对仲裁裁决不服怎么办?我教你四个狠招! 这个标题是什么意思呢?也就是说,当你(或用人单位)向劳动仲裁委提出仲裁申请后,但劳动仲裁结果没有维护你的权益,或者你不满意,…

【Nginx <三>⭐️⭐️⭐️】Nginx 负载均衡使用

目录 👋前言 👀一、 负载均衡概述 🌱二、项目模拟 2.1 环境准备 2.2 启动多个服务器 2.3 配置 Nginx 2.4 测试配置 💞️三、章末 👋前言 小伙伴们大家好,前不久开始学习了 Nginx 的使用,在…

如何克隆非默认分支

直接git clone下来的我们知道是默认分支,那如何克隆其他分支呢: 比如这个,我们想克隆AdvNet。 我们可以在本地文件夹打开Git Bash 依次输入: git clone --branch AdvNet https://github.com/wgcban/SemiCD.git cd SemiCD git b…

Monaco-Editor在Vue中使用(实现代码编辑与diff代码比较)--类似vscode代码编辑器

Monaco-Editor 是一个由 Microsoft 开发的 Web 代码编辑器,它是 Visual Studio Code 的浏览器版本。在 Vue 项目中集成 Monaco-Editor 可以提供代码编辑、语法高亮、智能提示等功能 效果: 1、安装使用,最好安装指定版本,我是 vue…

力扣算法之1070. 产品销售分析 III

力扣传送门 题解 选出每个售出过的产品 第一年 销售的 产品 id、年份、数量 和 价格,很明显就是个排序问题 我的解 SELECT product_id,year as first_year,quantity,price FROM ( SELECT sale_id,RANK() OVER(PARTITION BY product_id ORDER BY [year] asc ) A…

Matlab-熵权法

文章目录 熵权法一、模型简介二、例题1. 数据标准化2.指标的熵值和变异程度3.权重与评分4.代码实现 熵权法 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多…

Docker安装Nginx 并实现通过nginx部署静态网址

Docker镜像就是一个只读的模板,可以用来创建Docker容器。 例如:一个镜像可以包含一个完整的centos操作系统环境,里面仅安装了mysql、nginx等或用户需要的其他应用程序。 Docker提供了一个非常简单的机制来创建镜像或者更新现有的镜像&#…