【算法】力扣【二叉树,DFS,哈希集合,分类讨论】1110. 删点成林
题目描述
给出二叉树的根节点 root
,树上每个节点都有一个不同的值。如果节点值在 to_delete
中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。返回森林中的每棵树。你可以按任意顺序组织答案。
示例 1:
输入:root = [1,2,3,4,5,6,7]
, to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]
解释:
- 节点3被删除后,子节点6和7成为新的树的根节点。
- 节点5被删除后,子节点4成为新的树的根节点。
示例 2:
输入:root = [1,2,4,null,3]
, to_delete = [3]
输出:[[1,2,4]]
解释:
- 节点3被删除后,没有新的树产生,剩余的树仍然是
[1,2,4]
。
输入输出示例解释
- 输入:
root
为二叉树的根节点to_delete
为需要删除的节点值的列表
- 输出:
- 森林中每棵树的根节点列表
思路解析
核心思想
我们需要遍历二叉树,判断每个节点是否需要被删除。根据分类讨论:
-
如果当前节点需要被删除:
- 移除当前节点与父节点的连接
- 递归处理其左右子树
-
如果当前节点不需要被删除:
- 如果父节点被删除,则当前节点是新树的根节点,加入结果集
- 递归处理其左右子树
算法步骤
- 初始化:将
to_delete
列表转化为集合,方便O(1)时间复杂度判断。 - 深度优先搜索(DFS):
- 递归遍历二叉树。
- 根据当前节点是否需要删除,决定是否断开与父节点的连接。
- 根据父节点是否被删除,判断当前节点是否为新树的根节点。
- 返回结果:最终返回森林中的所有树的根节点。
复杂度分析
- 时间复杂度: