leetcode669修剪二叉搜索树

参考自“代码随想录”

本题需要想清楚以下几点:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值