这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战
描述
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 it's parent node becomes a leaf node and has the value target, it should also be deleted (you need to continue doing that until you can't).
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).
Example 2:
Input: root = [1,3,3,3,2], target = 3
Output: [1,3,null,null,2]
Example 3:
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.
Example 4:
Input: root = [1,1,1], target = 1
Output: []
Example 5:
Input: root = [1,2,3], target = 1
Output: [1,2,3]
Note:
1 <= target <= 1000
The given binary tree will have between 1 and 3000 nodes.
Each node's value is between [1, 1000].
解析
根据题意,就是给出了一个二叉树,让我们删除值为 target 的叶子结点,注意,在删除叶子结点之后可能父节点也称为了叶子结点,如果值为 target 也应该删除,不断重复此类操作直到不能进行下去,返回新树的索引。思路比较简单:
- 就是使用了递归思想,当前节点为空就直接返回 None ;
- 否则判断左子树是否为空;判断右子树是否为空;
- 当左右子树都为空且值为 target 的时候,说明其不该存在,就直接返回 None ;否则说明其应该存在,返回 root ;
- 递归节点返回的 root 即为新树的引用
解答
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution(object):
def removeLeafNodes(self, root, target):
"""
:type root: TreeNode
:type target: int
:rtype: 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
运行结果
Runtime: 44 ms, faster than 52.54% of Python online submissions for Delete Leaves With a Given Value.
Memory Usage: 14.4 MB, less than 17.80% of Python online submissions for Delete Leaves With a Given Value.
原题链接:leetcode.com/problems/de…
您的支持是我最大的动力