1110. 删点成林

news2025/1/19 11:33:42

DFS

1110. 删点成林

关键要点

  • 通过O(1)时间复杂度确认节点是否需要删除

Set to_deleteSet = new HashSet<>(); Arrays.stream(to_delete).forEach(to_deleteSet::add);

  • 使用深度优先搜索(DFS)遍历树

node.left = dfs(node.left, s, ans);
node.right = dfs(node.right, s, ans);

  • 当前节点处理逻辑

判断当前节点是否为待删除节点

  • 不是则返回节点,保持父子关系;
  • 当前节点为待删除节点:
    1. 添加左孩子、右孩子到结果集中【因为是DFS,所以不用考虑放入结果集中的孩子们是否也应该删除
    2. 删除当前节点【return null;】,断绝关系

代码编写

	/**
	 * 1110. 删点成林
	 * https://leetcode.cn/problems/delete-nodes-and-return-forest/description/
	 * @param root
	 * @param to_delete
	 * @return
	 */
	public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
	    if (Objects.isNull(root) || Objects.isNull(to_delete) || to_delete.length == 0) {
	        return Collections.singletonList(root);
	    }
	
	    // 确认是否需要删除node  O(1)
	    Set<Integer> to_deleteSet = new HashSet<>();
	    Arrays.stream(to_delete).forEach(to_deleteSet::add);
	
	    List<TreeNode> result = new ArrayList<>();
	    // DFS
	    if (!Objects.isNull(dfs(root, to_deleteSet, result))) {
	        result.add(root);
	    }
	
	    return result;
	}
	
	/**
	 * DFS->从下(子节点)向上(父节点)
	 * @param node
	 * @param s
	 * @param ans
	 * @return
	 */
	private TreeNode dfs(TreeNode node, Set<Integer> s, List<TreeNode> ans) {
	    if (Objects.isNull(node)) {
	        return null;
	    }
	    // 左
	    node.left = dfs(node.left, s, ans);
	    // 右
	    node.right = dfs(node.right, s, ans);
	
	    if (!s.contains(node.val)) {
	        // 当前节点不能删除(保持与父节点的链接)
	        return node;
	    }
	
	    // 当前节点为待删除的节点
	    if (!Objects.isNull(node.left)) {
	        ans.add(node.left);
	    }
	    if (!Objects.isNull(node.right)) {
	        ans.add(node.right);
	    }
	
	    // 删除当前节点(断开与父节点的链接)
	    return null;
	}

代码解析

  • 如果根节点为空或者删除数组为空,直接返回只含有根节点的列表。
  • 将待删除的节点值存入一个哈希集合 to_deleteSet 中。
  • 通过深度优先搜索(DFS)遍历树,判断当前节点是否需要删除。如果不需要删除,则递归遍历其左右子节点,并更新左右子节点的链接;如果需要删除,则将其左右子节点加入结果集 ans 中,并将当前节点删除。
  • 返回结果集 ans,即删除节点后的根节点集合。

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

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

相关文章

C语言《数据结构与算法》安排教学计划课设

背景&#xff1a; 10、安排教学计划 (1) 问题描述。 学校每学期开设的课程是有先后顺序的&#xff0c;如计算机专业&#xff1a;开设《数据结构》课程之前&#xff0c;必须先开设《C语言程序设计》和《离散数学》课程&#xff0c;这种课程开设的先后顺序称为先行、后继课程关…

RabbitMQ服务启动失败

报错信息&#xff1a; 在服务中启动RabbitMQ服务显示&#xff1a; RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因&#xff1a; 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…

定时任务处理-Spring Task

目录 1 前言 2 cron表达式 2.1 相关概念的介绍 2.2 举个例子(白雪警告) 2.3 使用网站自动生成 3 Spring Task的使用 3.1 导入依赖坐标 3.2 开启任务调度 3.3 自定义定时任务类 1 前言 当我们需要处理一些定时任务的时候就需要用到我们的Spring Task&#xff0c;接下来…

在vue3中使用及封装echarts

在vue3中使用及封装echarts 1.获取ECharts 从npm获取 npm install echarts2.在项目中引入ECharts&#xff08;父子组件无通信&#xff09; 导入echarts import * as echarts from echarts创建DOM结构 <template><div ref"myChart" style"width: …

数据库应用:Windows 部署 MySQL 8.0.36

目录 一、实验 1.环境 2.Windows 部署 MySQL 8.0.36 3.Windows配置环境变量 4.Navicat链接MySQL 二、问题 1.安装MySQL 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机软件版本IP备注WindowsMySQL8.0.36localhost 2.Windows 部署 MySQL 8.0.…

m估计及其c++简单实现

文章目录 什么是m估计怎么求解m估计呢&#xff1f;Huber函数时的线性m估计 什么是m估计 自20世纪60年代稳健统计建立以来&#xff0c;在国内外众多学者的研究之下&#xff0c;诞生了一系列稳健统计重要理论和成果。其中最主要且广泛使用的稳健统计有以下三类&#xff1a; L-e…

深度学习系列60: 大模型文本理解和生成概述

参考网络课程&#xff1a;https://www.bilibili.com/video/BV1UG411p7zv/?p98&spm_id_frompageDriver&vd_source3eeaf9c562508b013fa950114d4b0990 1. 概述 包含理解和分类两大类问题&#xff0c;对应的就是BERT和GPT两大类模型&#xff1b;而交叉领域则对应T5 2.…

【深度学习:视频注释】如何为机器学习自动执行视频注释

【深度学习&#xff1a;视频注释】如何为机器学习自动执行视频注释 #1&#xff1a;多目标跟踪 &#xff08;MOT&#xff09; 以确保帧与帧之间的连续性#2&#xff1a;使用插值来填补空白#3: 使用微模型加速人工智能辅助视频注释#4: 自动目标分割提高目标分割质量 自动视频标记通…

Sora将创造多少算力需求?

1.1 Sora 训练与推理算力需求初步测算 Sora发布表现亮眼&#xff0c;TransformerDiffusion架构或成为文生视频大模型新范式。据Sora技术报告&#xff0c;类似于LLM将不同文本数据统一为token&#xff0c;Sora可将不同类型的视频和图像等视觉数据统一为patches&#xff0c;具体…

<script> 标签中的type

typetext/javascript typeapplication/javascript 前者是比较早的版本&#xff0c;已经废弃&#xff0c;但是浏览器大都还支持 后者是最新的规范&#xff0c;但是会有兼容性问题&#xff0c;不兼容ie6-10 typeapplication/json 比较特殊&#xff0c;不常用 简单示例 <!DOCTY…

设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?

前言 在面向对象编程中&#xff0c;有一条非常经典的设计原则&#xff1a;组合优于继承&#xff0c;多用组合少用继承。 为什么不推荐使用继承&#xff1f; 组合比继承有哪些优势&#xff1f; 如何判断该用组合还是继承&#xff1f; 为什么不推荐使用继承&#xff1f; 继承…

如何在本地电脑部署HadSky论坛并发布至公网可远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

uvloop,一个强大的 Python 异步IO编程库!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 什么是uvloop库&#xff1f; 安装uvloop库 使用uvloop库 uvloop库的功能特性 1. 更…

redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案&#xff1a; 1&#xff09;方案一 2&#xff09;方案二 如何设计一个缓存策略&#xff0c;缓存热点数据&#xff1f;

自动化部署证书 acme.sh 使用教程

简介 acme.sh 是一个开源的 ACME 协议的客户端工具&#xff0c;用于自动化申请、更新和部署 SSL/TLS 证书。通过使用 acme.sh&#xff0c;用户可以轻松地在服务器上设置 HTTPS 加密连接&#xff0c;而无需手动操作。它支持多种 DNS 接口和证书颁发机构&#xff0c;可以与各种 …

多进程完成文件拷贝:2024/2/20(已修改)

作业1&#xff1a;使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源 代码&#xff1a; #include<myhead.h>//定义获取文件长度的函数 int get_file_len(const char *srcfile, const char *de…

静态时序分析:SDC约束命令set_drive详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定电阻值 指定端口列表 简单使用 指定上升、下降沿 指定最大最小、条件 写在最后 本章将讨论使用set_drive命令&#xff0c;它用于对输入端口的驱动能力建模。首先需要说明的…

【计算机网络】深度学习使用应用层的HTTP协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习使用应用层的HTTP协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 一:HTTP是什么二:HTTP请求1.HTTP请求的组成2.HTTP请求的方法…

freeswitch 权威指南 --- 高级篇

官网文档&#xff1a;https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程&#xff1a;https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》&#xff1a;目录&#xff1a;https://juejin.cn/post/702058079…

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…