1110. 删点成林

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

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

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

示例:

输入: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、各不相同的值。

Idea: Recursion, gathering information from left and right subtrees

# 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]:
        def helper(root):
            if not root: return []
            ls = helper(root.left)
            rs = helper(root.right)
            
            rl,rr=root.left,root.right
            root.left,root.right=None,None
            
            if root.val not in to_delete:
                merge=[]
                for l in ls:
                    if l.val!=rl.val:
                        merge.append(l)
                    else:
                        root.left=l
                for r in rs:
                    if r.val!=rr.val:
                        merge.append(r)
                    else:
                        root.right=r
                merge.append(root)
            else:
                merge = ls+rs
                
            return merge
        
        return helper(root)
    
 
原文地址:https://www.cnblogs.com/xxxsans/p/14048229.html