【算法】【二叉树,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_deleteif is_del:# 如果当前节点需要删除,则断开与其父节点的连接if node == fa.left:fa.left = Noneelif node == fa.right:fa.right = Noneelse:# 否则,根据父节点是否被删除,确定当前节点是否为一个子树的根节点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.mzph.cn/diannao/17881.shtml

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

相关文章

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天,埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资,主要用于打造一台巨大的超级计算机,马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI,技术和算力的发展历经了几个时代,但似乎马斯克的吸金能力一直…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树,在中序遍历后的结果为从小到大的一个序列,寻找二叉搜索树的最小绝对值差,只需比较一个节点与之后的差值即可。在遍历的过程中,我们需要一个节点保存前节点…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频:冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升,短道速滑作为其中一项紧张刺激、充满观赏性的运动,受到了越来越多人的关注。而在社交媒体和短视频平台的助力下,短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

vxe-form-design 表单设计器的使用

vxe-form-design 在 vue3 中表单设计器的使用 查看官网 https://vxeui.com 安装 npm install vxe-pc-ui // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...// ... createApp(App).use(VxeUI).mount(#app) // ...使用 github vxe-form-design 用…

Python在忘mysql密码后该如何重新连mysql

步骤一 先到mysql的bin目录下 步骤二 用mysqld delete mysql 把之前的库删了 步骤三 通过管理员模式进去后 用命令mysqld --skip-grant-tables越过验证 再输入mysql -u root 直达账户 步骤四 用FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password; 指…

Echarts x轴坐标二级分组

在使用echarts 封装组件的时候,偶尔会遇到需要x轴坐标进行二层分组的需求。那么如何对echarts 进行二层分组呢,有以下几个步骤: 仅介绍二层分组的逻辑。有兴趣的可以进行三层延伸。 1,修改echarts Options 中xAxis 的配置。 此…

【机器学习】K-近邻算法(KNN)全面解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 K-近邻算法(KNN)全面解析概述1. 基本概念与原理1.1 KNN算…

Excel表格保护密码遗忘怎么办?三秒钟破解密码,轻松解锁!

在我们的日常工作中,Excel表格是一个非常实用的工具,但在某些情况下,我们可能会遇到密码忘记的问题,或者在尝试打开或删除文件时被锁定。别担心,这里有三个简单的解决方法来帮助您解决问题。 一、尝试默认密码或常见密…

使用 Orange Pi AIpro开发板基于 YOLOv8 进行USB 摄像头实时目标检测

文章大纲 简介算力指标与概念香橙派 AIpro NPU 纸面算力直观了解 手把手教你开机与基本配置开机存储挂载设置风扇设置 使用 Orange Pi AIpro进行YOLOv8 目标检测Pytorch pt 格式直接推理NCNN 格式推理 是否可以使用Orange Pi AIpro 的 NPU 进行推理 呢?模型开发流程…

gitlab push 代码,密码正确,仍然提示HTTP Basic: Access denied. The provided password

HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password gitlab 登录账户密码确认正确,登录获取代码仍然提示以上问题,解决方案 …

①单细胞学习-数据读取、降维和分群

目录 ①数据读取 ②计算线粒体基因比例 ③分开进行质控 ④两组单细胞数据合并 ⑤细胞周期评分 ⑥降维标准流程 降维 UMAP可视化 选择分群 ⑦marker基因 分析marker基因 marker基因可视化 ⑧细胞定群命名 单细胞的数据格式学习:单细胞 10X 和seurat对象…

【软件设计师】算法

1、算法的效率 时间复杂度:程序从开始到结束所需要的时间 空间复杂度:算法在运行过程中临时占用存储空间大小的度量 时间渐近复杂度:时间复杂度由最高次幂决定(判断大小技巧:将n10代入) O(log2 n):二分查找法 O(n):for…

家政预约小程序07服务分类展示

目录 1 创建服务分类页面2 侧边栏选项卡配置3 配置数据列表4 从首页跳转到分类页总结 上一篇我们开发了首页的服务展示功能,本篇我们讲解一下服务分类功能的开发。在小程序中通常在底部导航栏有一个菜单可以展示所有服务,侧边选项卡可以展示分类信息&…

Python零基础一天丝滑入门教程(非常详细)

目录 第1章 初识python 第1节 python介绍 1.为什么要学习Python? 2.python排名 3.python起源 4.python 的设计目标 第2节 软件安装 第2章 快速上手:基础知识 第1节 Python3 基础语法 Python 变量 字面量 数据类型转换 Python3 注释 数据类…

垂类短视频:四川鑫悦里文化传媒有限公司

垂类短视频:内容细分下的新媒体力量 随着移动互联网的迅猛发展和智能手机的普及,短视频已成为当下最受欢迎的媒介形式之一。四川鑫悦里文化传媒有限公司而在短视频领域,一个新兴的概念——“垂类短视频”正逐渐崭露头角,以其独特…

设计模式 21 备忘录模式 Memento Pattern

设计模式 21 备忘录模式 Memento Pattern 1.定义 备忘录模式是一种行为型设计模式,它允许你将一个对象的状态保存到一个独立的“备忘录”对象中,并在之后恢复到该状态。 2.内涵 主要用于以下场景: 需要保存对象状态以备恢复: 当…

torch.matmul()的用法

这篇文章记录torch.matmul()的用法 这里仿照官方文档中的例子说明,此处取整数随机数,用于直观的查看效果: vector x vector 两个一维向量的matmul相当于点积,得到一个标量 tensor1 torch.randint(1, 6, (3,)) tensor2 torch.…

机器学习基础笔记

周志华老师的机器学习初步的笔记 绪论 知识分类 科学 是什么,为什么 技术 怎么做 工程 多快好省 应用 口诀,技巧,实际复杂环境,行行出状元 定义 经典定义 利用经验改善系统自身的性能 训练数据 模型 学习算法 分类 决策树…

Django5+React18前后端分离开发实战14 React-Router6 入门教程

使用nodejs18 首先,将nodejs切换到18版本: nvm use 18创建项目 npm create vitelatest zdpreact_basic_router_dev -- --template react cd zdpreact_basic_router_dev npm install react-router-dom localforage match-sorter sort-by npm run dev此…