首页 > 其他分享 >力扣---1110. 删点成林

力扣---1110. 删点成林

时间:2023-05-30 22:24:04浏览次数:28  
标签:--- null list 力扣 set 删点 root 节点 delete

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-nodes-and-return-forest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

利用一个变量来存储某个节点的父节点,再用一个变量 isHead 来存储下一个不需要删除的节点是否应该是头结点。

显然,当某个节点为被删除节点后,他的子树节点即有可能是头结点(需要注意连续删除的情况)。

class Solution {
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
        List<TreeNode> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>() {{
            for (int x : to_delete) {
                add(x);
            }
        }};
        dfs(root, null, true, set, list, true);
        return list;
    }
    private void dfs (TreeNode root, TreeNode parent, boolean isLeft, Set<Integer> set, List<TreeNode> list, boolean isHead) {
        if (root == null) {
            return;
        }
//        当前节点是需要删除的节点
        if (set.contains(root.val)) {
//            父节点非空
            if (parent != null) {
                if (isLeft) {
                    parent.left = null;
                } else {
                    parent.right = null;
                }
            }
            dfs(root.left, null, true, set, list, true);
            dfs(root.right, null, false, set, list, true);
        } else { 
//            如果当前节点是头结点,则放入到 list 中。
            if (isHead) {
                list.add(root);
            }
            dfs(root.left, root,true, set, list, false);
            dfs(root.right, root, false, set, list, false);
        }
    }
}

 

标签:---,null,list,力扣,set,删点,root,节点,delete
From: https://www.cnblogs.com/allWu/p/17444661.html

相关文章

  • About-Time
    AboutTimeCreated:2023-05-30T21:23+08:00Categories:Movies本科毕业答辩完的晚上,实在不想改论文,干脆看电影。《时空恋旅人》可能是至少四年前高中同桌兼舍友的推荐,看完才发现,啊,太好了,话说我咋记得这么清楚?电影一开始吸引到我的地方,是男主(Tim)和女主(Mary)在派对上的见面,BGM......
  • VulnHub_DC-3渗透流程
    VulnHub_DC-3DC-3是另一个特意建造的易受攻击的实验室,旨在获得渗透测试领域的经验。与之前的DC版本一样,这个版本是为初学者设计的,尽管这一次只有一个flag、一个入口点并且根本没有任何线索。必须具备Linux技能和熟悉Linux命令行,以及一些使用基本渗透测试工具的经验。......
  • Java并发(七)----线程sleep、yield、线程优先级
    1、sleep与yieldsleep调用sleep会让当前线程从Running进入TimedWaiting状态(阻塞)其它线程可以使用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出InterruptedException睡眠结束后的线程未必会立刻得到执行建议用TimeUnit的sleep代替Thread......
  • 6-2复数的加减运算
    ###复数加减(运算符重载)声明一个复数类CComplex(类私有数据成员为double型的real和image)定义构造函数,用于指定复数的实部与虚部。重载<<运算符,以格式real+imagei的格式输出当前对象(当虚部为非负数时,实部虚部中间用+号连接,当虚部为负数时,实部虚部用-号连接:如3+4i,3-4i,3+0i)。重载......
  • ubuntu下查看-卸载软件(卸载.net core sdk的方法)
    查看已安装的包:dpkg--list查看正则匹配的包:dpkg--list'dotnet-*' //查看以dotnet-开头的包卸载匹配的包:sudoapt-get--purgeremove<programname>按照正则卸载匹配的包:sudoapt-get--purgeremove'dotnet-*' //卸载以dotnet-开头的包如果不想自己手动输入Y确认的话则......
  • 计组----Cache命中率,平均访问时间,访问效率
    例题:概念解释:\(Cache\)中的数据为主存中数据的一个子集,用来与\(CPU\)的处理速度相匹配,当\(CPU\)访问存储器时会先访问\(Cache\),如果\(Cache\)没有找到需要的数据,就会去主存找,于是引入\(Cache\)命中率,用来描述在\(Cache\)完成存取的占比,我们希望数据都可以在\(Cache\)直接找到,所......
  • 每日总结-23.5.30
    <%@pageimport="wangzhan.Thesql"%><%@pageimport="wangzhan.Pd_P_assignment"%><%@pageimport="wangzhan.Pd_S_assignment"%><%@pagelanguage="java"contentType="text/html;charset=UTF......
  • 2023CISCN-badkey
    该题给了很多p,q的约束条件assertp>0assertq>0assertp!=qassertp.bit_length()==512assertq.bit_length()==512assertisPrime(p)assertisPrime(q)assertp%e!=1assertq%e!=1主要是限制你e与欧拉函数不互......
  • 06Vue3-Pinia
    PiniaPinia是西班牙语piña(西班牙语中的“菠萝”)单词的形似。它是一个状态管理的库,用于跨组件、页面进行状态共享(这点和Vuex、Redux一样),同时兼容Vue2、Vue3,也并不要求你使用CompositionAPI;Pinia开始于大概2019年,最初是作为一个实验,目的为了探索Vuex的下一次迭代会是什么样......
  • 动手学深度学习P3.1-线性神经网络-线性回归
    3.1线性回归回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。3.1.1线性回归的基本元素这一部分主要是各种原理及公式,还是需要直接去阅读全文~总结部分要点如下:线性回归的前提假设......