跳转至

LeetCode: 1110. 删点成林

1、题目描述

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

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

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

示例:

img

输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]
输出:[[1,2,null,4],[6],[7]]

提示:

  • 树中的节点数最大为 1000。
  • 每个节点都有一个介于 1 到 1000 之间的值,且各不相同。
  • to_delete.length <= 1000
  • to_delete 包含一些从 1 到 1000、各不相同的值。

2、解题思路

  • 递归法
  • 判断断开的节点:
  • 如果左节点为待删除节点,断开左节点连接
  • 如果右节点为待删除节点,断开右节点连接
  • 判断需要添加的节点:
  • 如果当前节点为待删除节点
    • 如果如果左节点不删除,添加左节点
    • 如果如果右节点不删除,添加右节点
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def delNodes(self, root: TreeNode, to_delete: List[int]) -> List[TreeNode]:
        if not root:
            return []
        res = []
        delete_set = set(to_delete)

        if root.val not in delete_set:
            res.append(root)

        def dfs(node):
            if not node:
                return

            left, right = node.left, node.right

            if node.val in delete_set:
                if left and left.val not in delete_set:
                    res.append(left)
                if right and right.val not in delete_set:
                    res.append(right)
            if left and left.val in delete_set:
                node.left = None

            if right and right.val in delete_set:
                node.right = None

            dfs(left)
            dfs(right)

        dfs(root)
        return res