草庐IT

leetcode 1110. Delete Nodes And Return Forest 删点成林(中等)

okokabcd 2023-03-28 原文

一、题目大意

给出二叉树的根节点 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

给一棵二叉树,每个节点值均不同,删除一些节点,由于删除非叶子节点会使原来的二叉树断开,从而会形成从棵二叉树,形成一片森林,返回森林中所有二叉树的根节点。

二叉树的题首先想到用递归,递归方法传递4个参数,当前节点;是否是根节点(如果是根节点、且存在左右子树才会形成新树);再传递一个hashset用来存储要删除的节点,达到常数据级搜索;还有一个保存结果的list。

在递归函数中,如果节点为空返回null,定义亦是deleted来保存当前节点值是否在hashset中,若是根节点且不需要被删除,则将节点加入返回结果list中。然后将左子节点赋值为对左子节点调用递归函数的返回值,右子节点赋值为对右子节点调用递归函数的返回值。最后判断当前节点是否被删除了,如果是的话返回空,否则返回当前指针。这样的话每棵树的根节点都在递归过程中存入结果list中了。

三、解题方法

3.1 Java实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
        List<TreeNode> ans = new ArrayList<>();
        Set<Integer> set = new HashSet<>();
        for (int tmp : to_delete) {
            set.add(tmp);
        }
        helper(root, true, set, ans);
        return ans;
    }

    TreeNode helper(TreeNode node, boolean isRoot, Set<Integer> set, List<TreeNode> ans) {
        if (node == null) {
            return null;
        }
        boolean deleted = set.contains(node.val);
        if (isRoot && !deleted) {
            ans.add(node);
        }
        node.left = helper(node.left, deleted, set, ans);
        node.right = helper(node.right, deleted, set, ans);
        return deleted ? null : node;
    }
}

四、总结小记

  • 2022/9/14 工作接踵而至

有关leetcode 1110. Delete Nodes And Return Forest 删点成林(中等)的更多相关文章

  1. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  2. IDEA使用LeetCode插件 - 2

    前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit

  3. javascript - 为什么 Math.pow(1, NaN) 在 JavaScript 中等于 NaN? - 2

    在IEEE754-2008节"9.2.1Specialvalues"有提到pow(+1,y)is1foranyy(evenaquietNaN)如果没有阅读整个文档,维基百科给出了shortcut:The2008versionoftheIEEE754standardsaysthatpow(1,qNaN)andpow(qNaN,0)shouldbothreturn1sincetheyreturn1whateverelseisusedinsteadofquietNaN.为什么Math.pow(1,NaN)在JavaScript中是NaN?不符合标准吗? 最佳答案

  4. LeetCode——2347. 最好的扑克手牌 - 2

    一、题目给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌,第i张牌大小为ranks[i],花色为suits[i]。下述是从好到坏你可能持有的手牌类型:“Flush”:同花,五张相同花色的扑克牌。“ThreeofaKind”:三条,有3张大小相同的扑克牌。“Pair”:对子,两张大小一样的扑克牌。“HighCard”:高牌,五张大小互不相同的扑克牌。请你返回一个字符串,表示给定的5张牌中,你能组成的最好手牌类型。注意:返回的字符串大小写需与题目描述相同。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/best-poker-hand/d

  5. javascript - 在 Node.js 中等待异步函数返回 - 2

    假设,我在Node.js中有一个异步函数,基本上是这样的:varaddAsync=function(first,second,callback){setTimeout(function(){callback(null,first+second);},1*1000);};现在我当然可以以异步方式调用这个函数:addAsync(23,42,function(err,result){console.log(result);//=>65});我想知道的是,您是否可以通过某种方式同步调用此函数。为此,我想要一个包装器函数sync,它基本上执行以下操作:varsync=function(fn,pa

  6. javascript - 在 nightwatch 中等待新 URL 加载的正确方法是什么? - 2

    我正在测试的页面有一个按钮,可以将您带到同一站点上的不同页面。单击该按钮后,我想等待该页面加载后再继续。通常,我只会等待该页面上的某些元素加载,但由于我最近更新了nightwatch/selenium,waitForElementPresent()测试已停止工作。在调试问题的过程中,我认为等待新URL加载是有意义的,但我没有看到守夜人的方式来做到这一点。我可以用一个pause()后跟一个assert.urlContains()来硬编码等待,但必须有更好的方法。有什么建议吗?过去的工作:this.waitForElementVisible(runCSS,3000).click(runCS

  7. LeetCode:344. 反转字符串 - 2

    🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123一、🌱344.反转字符串题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。来源:力扣(LeetCode)难度:简单提示:1s[i]都是ASCII码表中的可打印字符示例1:输入:s=[“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]示例2:输入:s=[“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”

  8. 【日常系列】LeetCode《28·动态规划3》 - 2

    数据规模->时间复杂度10^8内容二维数组中的路径问题买卖股票的最佳时机lc62【剑指098】【top100】:不同路径https://leetcode.cn/problems/unique-paths/提示:1题目数据保证答案小于等于2*10^9#方案一:dfs+记忆化classSolution:defuniquePaths(self,m:int,n:int)->int:memo=[[-1]*nfor_inrange(m)]defdfs(i,j):ifi==m-1andj==n-1:return1ifi>=morj>=n:return0ifmemo[i][j]!=-1:returnmemo[

  9. LeetCode:454. 四数相加 II —— 哈希表为什么叫哈希表~ - 2

    🍎道阻且长,行则将至。🍓🌻算法,不如说它是一种思考方式🍀算法专栏:👉🏻123hash是什么,哈希表为什么叫哈希表?一、🌱454.四数相加II题目描述:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0nums1[i]+nums2[j]+nums3[k]+nums4[l]==0来源:力扣(LeetCode)难度:中等提示:n==nums1.lengthn==nums2.lengthn==nums3.lengthn==nums4.length1-2^28示例1:输入:nums1=[1,2],nums2=[-2,-1],n

  10. javascript - javascript 中的脚本在 php 中等于 $_SERVER ['REQUEST_URI' ] 是什么? - 2

    我想通过附加iframe的javascript将URL传递到另一个域,当退出iframe时,另一个域可以将用户返回到我网站上的上一个页面。如果用php提交exit_url,就是$exit_url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."&request=example"";我想了解如何将此字符串转换为在javascript中使用。谢谢! 最佳答案 您可以通过附加location.pathname和location.search获得与$_SERVER['REQU

随机推荐