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,2,null,2,4], target = 2
Output: [1,null,3,null,4]
Explanation: Leaf nodes in green with value (target = 2) are removed (Picture in left).
After removing, new nodes become leaf nodes with value (target = 2) (Picture in center).
Input: root = [1,2,null,2,null,2], target = 2
Output: [1]
Explanation: Leaf nodes in green with value (target = 2) are removed at each step.
Constraints:
The number of nodes in the tree is in the range [1, 3000].
1 <= Node.val, target <= 1000
Solutions
Solution 1
Thinking
Leaves equal to \(\textit{target}\) must go, including those that become leaves after a child is removed. A preorder check misses a node that turns into a leaf only after its children disappear. Postorder fixes this: recurse on both children, then drop the node if it is now a target leaf. One walk performs the whole cascade.
1 2 3 4 5 6 7 8 91011121314151617
# 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 = rightclassSolution:defremoveLeafNodes(self,root:Optional[TreeNode],target:int)->Optional[TreeNode]:ifrootisNone:returnNoneroot.left=self.removeLeafNodes(root.left,target)root.right=self.removeLeafNodes(root.right,target)ifroot.leftisNoneandroot.rightisNoneandroot.val==target:returnNonereturnroot
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcremoveLeafNodes(root*TreeNode,targetint)*TreeNode{ifroot==nil{returnnil}root.Left=removeLeafNodes(root.Left,target)root.Right=removeLeafNodes(root.Right,target)ifroot.Left==nil&&root.Right==nil&&root.Val==target{returnnil}returnroot}