【1110. 删点成林】

这篇具有很好参考价值的文章主要介绍了【1110. 删点成林】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来源:力扣(LeetCode)

描述:

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

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

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

示例 1:
【1110. 删点成林】

输入: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、各不相同的值。

方法:深度优先搜索

思路

题目给定一棵树 root,树的每个节点都有一个各不相同的值。并且给定一个数组 to_delete,包含需要删除的节点值。返回删除所有的 to_delete 中的节点后,剩余的树的集合。

可以利用深度优先搜索来遍历每一个节点,定义函数 dfs,输入是参数是某个节点 node 和这个节点是否为潜在的新的根节点 is_root。函数中,首先判断这个节点是否要被删除,如果是,那么它的两个子节点(如果有的话)便成为了潜在的根节点。如果这个节点的值不在 to_delete 中并且 is_root 为 true,那么这个节点便成为了一个新的根节点,需要把它放入结果数组中。同时也要对它的两个子节点进行同样的操作。dfs 的返回值为更新后的 node。

对根节点调用一次 dfs,返回新的根节点数组即可。

代码:

class Solution {
public:
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        unordered_set<int> to_delete_set(to_delete.begin(), to_delete.end());
        vector<TreeNode *> roots;

        function<TreeNode *(TreeNode *, bool)> dfs = [&](TreeNode* node, bool is_root) -> TreeNode * {
            if (node == nullptr) {
                return nullptr;
            }
            bool deleted = to_delete_set.count(node->val) ? true : false;
            node->left = dfs(node->left, deleted);
            node->right = dfs(node->right, deleted);
            if (deleted) {
                return nullptr;
            } else {
                if (is_root) {
                    roots.emplace_back(node);
                }
                return node;
            }
        };

        dfs(root, true);
        return roots;
    }
};

执行用时:16ms, 在所有 C++ 提交中击败了92.74%的用户
内存消耗:24.6 MB, 在所有 C++ 提交中击败了77.82%的用户
复杂度分析
时间复杂度:O(n),其中 n 是树的节点数。
空间复杂度:O(n),其中 n 是树的节点数。
author:LeetCode-Solution文章来源地址https://www.toymoban.com/news/detail-464421.html

到了这里,关于【1110. 删点成林】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 455. 分发饼干 - 力扣(LeetCode)

    假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] = g[i],我们可以将这个饼干 j 分配给孩子 i ,这

    2024年01月25日
    浏览(46)
  • 【LeetCode力扣】42. 接雨水

    目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、双指针法     原题链接: 42. 接雨水 - 力扣(LeetCode)   示例 1:   输入: height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解释: 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表

    2024年02月08日
    浏览(36)
  • 18. 四数之和(力扣LeetCode)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你

    2024年02月19日
    浏览(43)
  • 【LeetCode力扣】86. 分隔链表

      目录 1、题目介绍 2、解题思路 2.1、双链表双指针 2.2、代码描述   原题链接: 86. 分隔链表 - 力扣(LeetCode)   示例 1: 输入: head = [1,4,3,2,5,2], x = 3 输出: [1,2,2,4,3,5]   示例 2: 输入: head = [2,1], x = 2 输出: [1,2]   提示: 链表中节点的数目在范围 [0, 200] 内 -100 = Node.val

    2024年02月08日
    浏览(31)
  • 力扣(Leetcode)——python3

    目录 动态规划 70、爬楼梯 198、打家劫舍 213、打家劫舍Ⅱ  509、斐波那契数 740、删除并获得点数 746、使用最小花费爬楼梯 1137、第N个泰波那契序列 Dynamic Programming 递归+迭代 力扣 https://leetcode.cn/problems/jump-game-ii/ 给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

    2024年02月03日
    浏览(40)
  • 40. 组合总和 II - 力扣(LeetCode)

    题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 输入示例 输出示例 解题代码

    2024年01月23日
    浏览(39)
  • LeetCode(力扣)455. 分发饼干Python

    https://leetcode.cn/problems/assign-cookies/ 从大遍历 从小遍历

    2024年02月09日
    浏览(35)
  • LeetCode(力扣)37. 解数独Python

    https://leetcode.cn/problems/sudoku-solver/description/

    2024年02月09日
    浏览(34)
  • LeetCode(力扣)39. 组合总和Python

    https://leetcode.cn/problems/combination-sum/description/

    2024年02月09日
    浏览(35)
  • leetcode(力扣) 2866. 美丽塔 II

    原题链接 每次选取下标 i 为峰值, 进行 n 次,对每次取max就可以找到答案 对于 i 左边的序列: 需要满足序列是非递减的, 同时每个值尽可能大 所以满足: j 的位置上的数 = (j, i] 上的最小的值 (等于时取得最大值) , 同时需要保证 j 位置上的数要小于heights[j] (题目中的要求,美丽

    2024年04月29日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包