【每日一题Day222】LC1110删点成林 | dfs后序

简介: 【每日一题Day222】LC1110删点成林 | dfs后序

删点成林【LC1110】

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

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

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

又是一段瓶颈期

2023/5/30

  • 思路遍历树时,如果当前节点需要删除,那么其孩子节点如果存在的话,那么就变成了单独的树,需要单独添加至结构集中。
  • 因此,可以使用哈希表记录 to_delete 中的值,快速判断某个节点是否需要删除
  • 然后后序遍历该树,先将左右子树中需要删除的节点删除,然后判断父节点是否需要删除
  • 如果需要删除时如果左右孩子不为空,将其放入结果集中;
  • 如果父节点不需要删除,七左右子树中某些节点可能已经被删除,那么更新其左右孩子
  • 最后判断根节点是否被删除,如果未被删除,那么将其放入结果集中(也可以设置假的根节点,避免重复代码)
  • 实现
/**
 * 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 {
    // 后序 如果根节点要删除,那么把左右节点放入结果集中
    Set<Integer> del;
    List<TreeNode> res;
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {
        this.del = new HashSet<>();
        this.res = new ArrayList<>();
        for (int d : to_delete){
            del.add(d);
        }
        TreeNode newRoot = dfs(root);
        if (newRoot != null){
            res.add(newRoot);
        }
        return res;
    }
    public TreeNode dfs(TreeNode node){
        if (node == null){
            return null;
        }
        node.left = dfs(node.left);
        node.right = dfs(node.right);
        if (del.contains(node.val)){// 删除当前节点           
            // 如果孩子节点不为空,加入结果集中
            if (node.left != null){
                res.add(node.left);
            }
            if (node.right != null){
                res.add(node.right);
            }
            node = null;
        }
        return node;
    }
}

复杂度

  • 时间复杂度:O(n+m),n为二叉树的节点数目,mto_delete的长度
  • 空间复杂度:O(n+m)
目录
相关文章
|
6月前
【每日一题Day335】LC1993树上的操作 | dfs
【每日一题Day335】LC1993树上的操作 | dfs
45 0
|
6月前
【每日一题Day212】LC1373二叉搜索子树的最大键值和 | dfs+树形dp
【每日一题Day212】LC1373二叉搜索子树的最大键值和 | dfs+树形dp
28 0
|
6月前
|
定位技术
【每日一题Day200】LC1263推箱子 | 01-BFS
【每日一题Day200】LC1263推箱子 | 01-BFS
41 1
|
6月前
【每日一题Day295】LC617合并二叉树 | DFS BFS
【每日一题Day295】LC617合并二叉树 | DFS BFS
24 0
|
6月前
|
存储 人工智能 BI
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
52 0
|
6月前
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
36 0
|
6月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
38 0
|
存储
【每日一题Day58】LC1785构成特定和添加的最少元素 | 贪心
思路:首先统计数组nums的和sum,然后计算sum与goal的差target,我们需要向数组中添加最少的元素,使元素的和满足差值,元素的个数即为最终结果,因此每次添加的元素应尽可能最大。由于添加数值的绝对值大小受limit限制,因此添加元素的数值绝对值为limit的个数为Math.abs(target)/limit,如果Math.abs(target)不等于0,那么还需添加一个元素使和等于target
64 1
|
机器学习/深度学习
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false 。
98 0
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心
leetcode-每日一题623. 在二叉树中增加一行(DFS)
这题的要求:根节点为深度1开始,在depth深度创建一个新的节点,把原来depth深度的节点,父节点的左子节点依旧为新节点的左子节点,右子节点依旧为新节点的右子节点。
78 0
leetcode-每日一题623. 在二叉树中增加一行(DFS)