【每日一题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)
目录
相关文章
|
4月前
【每日一题Day335】LC1993树上的操作 | dfs
【每日一题Day335】LC1993树上的操作 | dfs
40 0
|
4月前
【每日一题Day214】LC1080根到叶路径上的不足节点 | 递归
【每日一题Day214】LC1080根到叶路径上的不足节点 | 递归
43 0
|
4月前
【每日一题Day212】LC1373二叉搜索子树的最大键值和 | dfs+树形dp
【每日一题Day212】LC1373二叉搜索子树的最大键值和 | dfs+树形dp
27 0
|
4月前
【每日一题Day295】LC617合并二叉树 | DFS BFS
【每日一题Day295】LC617合并二叉树 | DFS BFS
22 0
|
4月前
|
存储 人工智能 BI
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
46 0
|
4月前
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
29 0
|
4月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
34 0
|
4月前
|
人工智能 BI
【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd
【每日一题Day324】LC1462课程表 IV | BFS 拓扑排序 Floyd
28 0
|
4月前
【每日一题Day249】LC1186删除一次得到子数组最大和 | 动态规划
【每日一题Day249】LC1186删除一次得到子数组最大和 | 动态规划
39 0
|
机器学习/深度学习
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
86 0