LeetCode 1110. Delete Nodes And Return Forest【二叉树,DFS,哈希表】中等

news2024/10/7 10:14:09

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给出二叉树的根节点 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、各不相同的值。

思考以下问题:

  • 如何快速判断节点值是否在 toDelete \textit{toDelete} toDelete 中?
  • 如果当前节点被删除,但是左儿子(右儿子)没被删除,意味着什么?

其实很简单:

  • t o D e l e t e toDelete toDelete 全部丢到一个哈希表 s s s 或位图 b s t bst bst 中,这样可以 O ( 1 ) O(1) O(1) 判断节点值是否在 toDelete \textit{toDelete} toDelete 中。
  • 如果当前节点被删除,但左儿子(右儿子)没被删除,意味着左儿子(右儿子)是一棵树的根节点,加入答案

解法1 后序遍历

写一个 DFS(后序遍历):

  • 更新左儿子(右儿子)为递归左儿子(右儿子)的返回值。
  • 如果当前节点被删除,那么就检查左儿子(右儿子)是否被删除,如果没被删除,就加入答案
  • 如果当前节点被删除,返回空节点,否则返回当前节点。
  • 最后,如果根节点没被删除,把根节点加入答案。
class Solution {
private:
    vector<TreeNode*> ans;
    bitset<1010> bst;
    TreeNode* dfs(TreeNode* root) {
        if (root == nullptr) return nullptr;
        root->left = dfs(root->left);
        root->right = dfs(root->right);
        if (!bst[root->val]) return root;
        if (root->left) ans.push_back(root->left);
        if (root->right) ans.push_back(root->right);
        return nullptr;
    }
public:
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        for (int del : to_delete) bst[del] = 1;
        root = dfs(root);
        if (root) ans.push_back(root);
        return ans;
    }
};

解法2 先序遍历

上述解法是先递去,并在归来后解决问题。这里使用先序遍历,在「递」的过程中获取答案,因此可将 r o o t root root 的处理合并到递归函数中。

做法是:设置一个额外的 bool 参数 i s T r e e isTree isTree 。对一个子树的根结点来说,如果它在要删除的结点之列, 递归左右儿子时 i s T r e e isTree isTree 就为 t r u e true true ,如果它的左右儿子(存在且)不在删除之列,那么就是新树的根

class Solution { 
public:
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        vector<TreeNode*> ans;
        bitset<1010> bst;
        for (int del : to_delete) bst[del] = 1;
        function<TreeNode*(TreeNode*, bool)> dfs = [&](TreeNode* root, bool isTree) -> TreeNode* {
            if (root == nullptr) return nullptr; 
            bool flag = bst[root->val];
            if (isTree && !flag) ans.push_back(root);
            root->left = dfs(root->left, flag);
            root->right = dfs(root->right, flag);
            return flag ? nullptr : root;
        };
        dfs(root, true); 
        return ans;
    }
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

SKD240

SKD240 系列智能电力仪表 SKD240 系列智能电力仪表是陕西斯科德智能科技有限公司自主研发、生产的。 产品概述 - 点击了解详情 SKD240采用先进的微处理器和数字信号处理技术&#xff08;内置主芯片采用32位单片机, 采用32位浮点型真有效值处理数据&#xff09;&#xff0c;测量…

图像采集卡的基本原理、应用领域和发展趋势

图像采集卡是一种硬件设备&#xff0c;用于将模拟视频信号转换为数字信号&#xff0c;并将其传输到计算机中进行处理和存储。它通常用于监控、视频会议、医学图像等领域。本文将介绍图像采集卡的基本原理、应用领域和发展趋势。 一、图像采集卡的基本原理 图像采集卡的基本原…

视频里的声音怎么转换成音频?

视频里的声音怎么转换成音频&#xff1f;这样我们就能把视频里的想要的声音在其他音频平台播放或是用于其他视频。其实视频提取音频是一种将视频文件中的音频数据分离出来的技术。该技术可以将视频中的音频转换为不同的格式&#xff0c;让我们可以在无需视频的情况下使用音频文…

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执…

【Zero to One系列】在WSL linux系统上,使用docker运行Mysql与Nacos,以及如何启动与停止WSL

前期回顾&#xff1a; 【Zero to One系列】window系统安装Linux、docker 1、下载docker-compose 1.下载&#xff1a; curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose 2.授予权限&a…

大数据治理入门系列:元数据管理

在介绍数据治理一文中&#xff0c;我们曾用在图书馆找书的例子解释为什么需要进行数据治理。数据治理在某种程度上类似于图书管理。元数据管理作为数据治理的重要一环&#xff0c;也可以进行这种类比。 在图书管理过程中&#xff0c;需要根据相应的制度购买、记录、存放、借还…

【LeetCode: 486. 预测赢家 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【T+】畅捷通T+设置收入成本配比结转

【问题需求】 收入成本配比原则是指&#xff1a; 取得的销售收入应与为取得该收入所发生的成本相匹配&#xff0c; 即先出库后销货时需要等收到销售发票才能确认成本&#xff0c; 先销货后出库时要先确认虚拟成本。 【解决方案】 重点&#xff1a;业务流程选择【单据立账】的情…

ArcGis系列-java发布空间表为地图服务(map)

1,实现思路 使用java调用cmd命令执行python脚本python环境使用arcgis pro安装目录下的 \ArcGIS\Pro\bin\Python\envs\arcgispro-py3作为地图服务应该可以支持添加样式文件发布表需要用到sde文件,使用java创建sde的代码可以看这里发布表时,先在本地的空项目模板中添加数据库表作…

vue模拟el-table演示插槽用法

vue模拟el-table演示插槽用法 转载自&#xff1a;www.javaman.cn 很多人知道插槽分为三种&#xff0c;但是实际到elementui当中为什么这么用&#xff0c;就一脸懵逼&#xff0c;接下来就跟大家聊一聊插槽在elementui中的应用&#xff0c;并且自己写一个类似el-table的组件 vue…

回归问题里的数学

假设一个简单的案例 投入的广告费越多&#xff0c;广告的点击量就越高&#xff0c;进而带来访问数的增加&#xff0c;不过点击量经常变化&#xff0c;投入同样的广告费未必能带来同样的点击量。根据广告费和实际点击量的对应关系数据&#xff0c;可以将两个变量用下面的图展示…

CASA模型:生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟

查看原文>>>生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用 目录 第一章 CASA模型介绍&#xff08;讲解案例实践&#xff09; 第二章 CASA初步操作 第三章 CASA数据制备&#xff08;一&#xff09; 第四章 CASA数据制备&am…

4_回归算法(算法原理推导+实践)

文章目录 1 线性回归1.1 定义1.2 题目分析1.3 误差项分析1.4 目标函数推导1.5 线性回归求解1.6 最小二乘法的参数最优解 2 目标函数&#xff08;loss/cost function&#xff09;3 模型效果判断4 机器学习调参5 梯度下降算法5.1 梯度方向5.2 批量梯度下降算法&#xff08;BGD&am…

Spring IOC容器及DI相关概念

文章目录 一、组件、框架、容器的相关概念1.组件2.框架3.容器4.总结 二、IOC与DI简介1.IOC入门案例2.DI入门案例 一、组件、框架、容器的相关概念 1.组件 组件是为了代码的重用而对代码进行隔离封装&#xff0c;组件的呈现方式是单个或多个.class文件&#xff0c;或者打包的.…

Flutter的手势识别功能实现GestureDetector

GestureDetector简介 GestureDetector 是 Flutter 中一个非常常用的小部件&#xff0c;它提供了许多手势识别的功能&#xff0c;包括点击、双击、长按、拖动、缩放等等。 使用方法 GestureDetector 可以包裹其他部件&#xff0c;当用户在这些部件上进行手势操作时&#xff0…

基于SSM的网辩平台的设计与实现

摘 要 线上作为当前信息的重要传播形式之一&#xff0c;线上辩论系统具有显著的方便性&#xff0c;是人类快捷了解辩论信息、资讯等相关途径。但在新时期特殊背景下&#xff0c;随着网辩的进一步优化&#xff0c;辩论赛结合网络平台融合创新强度也随之增强。本文就网辩平台进…

尧泰汉海五城联动,“益”起圆梦!用爱守护成长,助力502名孩子实现心愿

公益的力量让孩子们的梦想被看见。 文具套装、书包、篮球 、益智积木、生日蛋糕......一个个看似小小的心愿&#xff0c;对于城市里的孩子来说是平常不过的礼物&#xff0c;但却成了许多正处于困境孩子的期待。 本次活动由重庆市慈善总会指导&#xff0c;Home尧泰汉海慈善专项…

【项目】ROS下使用乐视深度相机LeTMC-520

本文主要记录如何在ros下使用乐视深度相机。乐视三合一体感摄像头LeTMC-520其实就是奥比中光摄像头&#xff08;Orbbec Astra Pro&#xff09; 系统&#xff1a;Ubuntu20.04 这款相机使用uvc输入彩色信息&#xff0c;需要使用libuvc、libuvc_ros才能在ROS上正常使用彩色功能。…

k8s实战2-用minikube发布本地应用

官网的教程中&#xff0c;hello-minikube其镜像都在网上(dockerhub)上&#xff0c;如何把本地打包的docker镜像发布到minikube中 1 终端上运行eval $(minikube docker-env) 此命令的作用是使用Minikube Docker守护进程&#xff0c;跟原来docker desktop的docker进程区别开来 …

FPGA深层解析

概览 高端设计工具为少有甚是没有硬件设计技术的工程师和科学家提供现场可 编程门阵列(FPGA)。无论你使用图形化设计程序,ANSI C语言还是VHDL语言, 如此复杂的合成工艺会不禁让人去想FPGA真实的运作情况。在这个芯片中的程 序在这些可设置硅片间到底是如何工作的。本书会使…