赞
踩
给出二叉树的根节点 root
,树上每个节点都有一个不同的值。如果节点值在 to_delete
中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。返回森林中的每棵树。你可以按任意顺序组织答案。
输入:root = [1,2,3,4,5,6,7]
, to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]
解释:
输入:root = [1,2,4,null,3]
, to_delete = [3]
输出:[[1,2,4]]
解释:
[1,2,4]
。root
为二叉树的根节点to_delete
为需要删除的节点值的列表我们需要遍历二叉树,判断每个节点是否需要被删除。根据分类讨论:
如果当前节点需要被删除:
如果当前节点不需要被删除:
to_delete
列表转化为集合,方便O(1)时间复杂度判断。# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def delNodes(self, root: Optional[TreeNode], to_delete: List[int]) -> List[TreeNode]: """ 遍历二叉树在所难免,每个节点非删即不删,因此,我们先从分类讨论开始思考。 如果当前节点要被删除,则: 移除当前节点与上一个节点的连接 否则: 检查上一个节点是否被删除: 如果上一个节点被删除,那么当前节点就是森林中的一棵树的根节点。 否则,当前节点就不是根节点 """ def dfs(fa: TreeNode, node: TreeNode, is_del: bool): if node is None: return # 保留父节点是否需要被删除这一信息 fa_is_del = is_del # 获取当前节点是否需要被删除这一信息 is_del = node.val in to_delete if is_del: # 如果当前节点需要删除,则断开与其父节点的连接 if node == fa.left: fa.left = None elif node == fa.right: fa.right = None else: # 否则,根据父节点是否被删除,确定当前节点是否为一个子树的根节点 if fa_is_del: # 父节点被删除,当前节点是根节点 ans.append(node) # 递归遍历左右子树 dfs(node, node.left, is_del) dfs(node, node.right, is_del) ans = [] to_delete = set(to_delete) # 转为哈希集合,以O(1)的时间判断每个节点是否需要删除。 # 特殊情况:如果根节点不为空且根节点不在删除列表中,需要将根节点作为结果的一部分 if root and root.val not in to_delete: ans.append(root) dfs(TreeNode(), root, True) return ans
本题通过DFS遍历二叉树,结合分类讨论的方法,逐步删除指定节点并生成新的森林。该算法有效地处理了节点删除后树结构的调整问题,并通过哈希集合优化删除判断的时间复杂度,最终实现了高效的解决方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。