题解使用了递归的深度优先搜索(DFS)策略来遍历二叉树,并根据to_delete集合中的值删除相应节点。首先,将to_delete列表转换为集合以提高查找效率。定义递归函数traverse来遍历树,如果当前节点在to_delete中,则将其子节点(如果存在)加入结果列表并返回None以从树中删除当前节点;如果当前节点不在to_delete中,将其加入结果列表,并递归处理其左右子节点。递归的基准情况是遇到空节点。这样处理后,能有效地分解原树为若干不相交的子树。
时间复杂度: O(n)
空间复杂度: O(n + m)
# 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]:
to_delete = set(to_delete) # 转换为集合提高查找效率
res = [] # 存储最终的森林中各树的根节点
def traverse(root, parent=None):
nonlocal res
if not root: # 如果当前节点为空,返回None
return
left = traverse(root.left, root) # 递归处理左子树
right = traverse(root.right, root) # 递归处理右子树
if root.val in to_delete: # 如果当前节点需要删除
if right:
res.append(right) # 将右子树根节点加入结果列表
if left:
res.append(left) # 将左子树根节点加入结果列表
return # 返回None表示从树中删除当前节点
root.left = left # 更新当前节点的左孩子
root.right = right # 更新当前节点的右孩子
if not parent: # 如果当前节点是新的树的根节点
res.append(root) # 将其加入结果列表
return root # 返回当前节点,表示其未被删除
traverse(root) # 开始递归遍历树
return res # 返回结果列表