You are given a binary tree root and an integer target, delete all the leaf nodes with value target.
Note that once you delete a leaf node with value target, if its parent node becomes a leaf node and has the value target, it should also be deleted (you need to continue doing that until you cannot).
Example 1:
Input: root = [1,2,3,5,2,2,5], target = 2
Output: [1,2,3,5,null,null,5]Example 2:
Input: root = [3,null,3,3], target = 3
Output: []Explanation: The output is an empty tree after removing all the nodes with value 3.
Constraints:
1 <= number of nodes in the tree <= 30001 <= Node.val, target <= 1000# 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 removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
if not root:
return None
root.left = self.removeLeafNodes(root.left, target)
root.right = self.removeLeafNodes(root.right, target)
if not root.left and not root.right and root.val == target:
return None
return root# 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 removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
stack = [root]
visit = set()
parents = {root: None}
while stack:
node = stack.pop()
if not node.left and not node.right:
if node.val == target:
p = parents[node]
if not p:
return None
if p.left == node:
p.left = None
if p.right == node:
p.right = None
elif node not in visit:
visit.add(node)
stack.append(node)
if node.left:
stack.append(node.left)
parents[node.left] = node
if node.right:
stack.append(node.right)
parents[node.right] = node
return root# 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 removeLeafNodes(self, root: Optional[TreeNode], target: int) -> Optional[TreeNode]:
if not root:
return None
stack = []
cur = root
visited = None
while stack or cur:
while cur:
stack.append(cur)
cur = cur.left
cur = stack[-1]
if cur.right and cur.right != visited:
cur = cur.right
continue
stack.pop()
if not cur.left and not cur.right and cur.val == target:
if not stack:
return None
parent = stack[-1]
if parent.left == cur:
parent.left = None
elif parent.right == cur:
parent.right = None
else:
visited = cur
cur = None
return root