• leetcode 1110. 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、各不相同的值。

    来源:力扣(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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    四、总结小记

    • 2022/9/14 工作接踵而至
  • 相关阅读:
    cefsharp119.1.20(cef119.1.2,Chromium119.0.6045.105)版本升级体验及其他H264版本
    uni-app之android离线自定义基座
    初识数据结构
    【思维构造】Find The Array—CF1463B
    【Axure教程】雷达扫描动态效果(航空信息可视化案例)
    Linux —— 进程控制
    招聘| 嵌入式軟件(单片机)工程师
    模块语法笔记
    JavaScript对象
    python+vue理发店管理系统
  • 原文地址:https://blog.csdn.net/ln_ydc/article/details/126851447