LeetCode 1110. 删点成林

news/2025/2/12 21:54:52/

【LetMeFly】1110.删点成林

力扣题目链接:https://leetcode.cn/problems/delete-nodes-and-return-forest/

给出二叉树的根节点 root,树上每个节点都有一个不同的值。

如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。

返回森林中的每棵树。你可以按任意顺序组织答案。

 

示例 1:

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

示例 2:

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

 

提示:

  • 树中的节点数最大为 1000
  • 每个节点都有一个介于 1 到 1000 之间的值,且各不相同。
  • to_delete.length <= 1000
  • to_delete 包含一些从 1 到 1000、各不相同的值。

方法一:深度优先搜索DFS

写一个函数dfs(root),返回root节点是否需要保留,并递归判断root的左右子是否需要保留。

  • 如果root不需要保留,但左右子中有需要保留的,则需要保留的字节的将称为新的根节点(加入到答案的根节点数组中)。
  • 否则(root需要保留),如果root的子节点不需要保留,则修改root的子节点为空。

就可以了。

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树节点个数
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++

class Solution {
private:vector<TreeNode*> ans;unordered_set<int> toDelete;bool dfs(TreeNode* root) {  // 是否需要保留rootif (!root) {return false;}bool keepLeft = dfs(root->left);bool keepRight = dfs(root->right);if (toDelete.count(root->val)) {  // 删rootif (keepLeft) {ans.push_back(root->left);}if (keepRight) {ans.push_back(root->right);}// delete root;return false;}else {root->left = keepLeft ? root->left : nullptr;root->right = keepRight ? root->right : nullptr;return true;}}
public:vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {for (int t : to_delete) {toDelete.insert(t);}if (dfs(root)) {ans.push_back(root);}return ans;}
};

Python

# from typing import Optional, Listclass Solution:def dfs(self, root: Optional[TreeNode]) -> bool:if not root:return FalsekeepLeft = self.dfs(root.left)keepRight = self.dfs(root.right)if root.val in self.toDelete:  # 删rootif keepLeft:self.ans.append(root.left)if keepRight:self.ans.append(root.right)return Falseelse:root.left = root.left if keepLeft else Noneroot.right = root.right if keepRight else Nonereturn Truedef delNodes(self, root: Optional[TreeNode], to_delete: List[int]) -> List[TreeNode]:self.ans = []self.toDelete = set()for t in to_delete:self.toDelete.add(t)if self.dfs(root):self.ans.append(root)return self.ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130941100


http://www.ppmy.cn/news/106044.html

相关文章

NLP语料库学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言中文语料库 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 语料库有的是标记过的&#xff08;annotated&#xff09;&#xff0c;意味…

企业数字化转型,关于数据应用的三点分析

企业数字化转型已经成为当今商业领域的热门话题。在这个信息爆炸的时代&#xff0c;企业意识到数据的价值&#xff0c;开始将其作为一种战略资源来应用。数据应用是企业数字化转型中至关重要的一环&#xff0c;以下是关于数据应用的三点分析。 首先&#xff0c;数据应用为企业提…

家政服务预约APP的系统设计与实现

摘 要&#xff1a;针对家政行业蓬勃发展&#xff0c;老套的家政服务方式已经跟不上互联网时代的步伐这个问题。基于Android移动平台的分析和设计过程、C/S模式、Eclipse平台&#xff0c;采用Java语言进行开发设计&#xff0c;设计了基于MVC架构的实现方案。安卓客户端与服务器…

深入解析Spring源码系列:Day 5 - Spring事务管理原理

深入解析Spring源码系列&#xff1a;Day 5 - Spring事务管理原理 欢迎来到本系列的第五篇博客。在前几篇博客中&#xff0c;我们探讨了Spring框架的核心概念&#xff0c;包括Bean的生命周期、作用域和AOP原理。今天&#xff0c;我们将深入研究Spring框架中的事务管理原理。 事…

Idea+maven+springboot项目搭建系列--1 整合Rocketmq

前言&#xff1a;本文以mavenspringboot 整合Rocketmq 完成消息的发送和接收。 1 Rocketmq 介绍&#xff1a; 1.1 Rocketmq 特性&#xff1a; Apache RocketMQ是一款快速、可靠的分布式消息传递和流处理平台&#xff0c;具有可扩展性和高性能。它是一个分布式的、去中心化的消…

《深入理解计算机系统(CSAPP)》第3章 程序的机器级表示 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

相对于Vue3,Vue4都做了哪些改进

经过长时间的开发和测试&#xff0c;Vue Router 4 带来了许多改进和新功能&#xff0c;为Vue 3应用程序提供了一致性的改进。本文将介绍Vue Router 4 相对于Vue 3的改进和新特性。 1. 项目结构优化&#xff1a; Vue Router 4 进行了项目结构优化&#xff0c;将其分为三个模块…

java基于springboot自来水收费缴费系统+jsp

本次设计拟采用JAVA技术&#xff0c;对乡镇自来水收费系统的功能需求进行了全面分析&#xff0c;从模块功能定义、前后端交互技术、数据库及编程语言的选择、系统调试及测试、功能完善和改进等方面进行设计&#xff0c;解决了从用户新装、抄表、计费、收费、复查、换表、发票管…