参考自“代码随想录”
本题需要想清楚以下几点:
1.当我node.val小于题目左边界时,node左子树全剪切掉,只需要考虑右子树,因为右子树所有节点都比node大,则右子树有部分节点是符合区间要求的,我们继续向下考查剪切右子树就可以完成了。
2.递归函数的返回值问题,这里的递归函数返回值均返回的是处理之后的二叉树新根节点
3.与二叉搜索树的插入和删除节点类似,我们仍采用返回值的方式来删除节点,我们将正在处理删除的node的孩子节点,返回给上层函数(对应node的父节点),那么node节点就被自然地删除了。这个原理其实与链表删除节点是几乎一样的,都是修改指针跳过删除节点而已。
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
def recursion_delete(node):
#终止条件
if not node:
return None
#如果当前当前节点<左边界,则该节点左子树全剪掉,但右子树有可能有符合区间的节点
if node.val < low:
if not node.right:
return None
result = recursion_delete(node.right)#递归进右子树,剪切掉不在区间的节点。重点要记住,递归函数的返回值是完成这颗树剪切工作之后的新根节点
return result
#与上一种情况对称
if node.val > high:
if not node.left:
return None
result = recursion_delete(node.left)
return result
node.left = recursion_delete(node.left)
node.right = recursion_delete(node.right)
return node
return recursion_delete(root)