二叉树——12.二叉搜索树中的搜索

力扣题目链接

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

思路总结

  1. 二叉搜索树的性质:二叉搜索树是每个节点的左子树节点值小于该节点的值,右子树节点值大于该节点的值。正是利用这个性质,可以在树中高效地搜索目标值。

  2. 递归:这个方法使用了递归的思路,在树中搜索目标节点。每次递归调用都在减少搜索范围(要么在左子树,要么在右子树),从而逐步逼近目标值。

  3. 返回值的关键性:代码中的 return 语句是核心部分。当在当前节点找到目标值时,立即返回该节点,停止进一步的递归。这也是为什么必须有返回值的原因:如果没有 return,递归调用会继续下去,最终遍历整棵树,而这显然不是我们期望的搜索行为。

  4. 递归结束条件:递归的结束条件是当前节点为空或者找到了目标值,这确保了递归能够正确地结束并返回结果。

完整代码如下:

class Solution:
    def searchBST(self, root: TreeNode, val: int) -> TreeNode:
        # 为什么要有返回值: 
        #   因为搜索到目标节点就要立即return,
        #   这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。

        if not root or root.val == val: 
            return root

        if root.val > val: 
            return self.searchBST(root.left, val)

        if root.val < val: 
            return self.searchBST(root.right, val)
        if not root or root.val == val: 
            return root

这是方法的第一个判断条件。这个条件有两个部分:

  1. if not root:如果当前节点为空(即树已经遍历到了叶节点的下一层),说明在树中没有找到目标值,此时返回 None
  2. or root.val == val:如果当前节点的值正好等于目标值 val,则返回这个节点,表示找到了目标节点。

这一步确保了如果找到了目标节点,就立即返回,而不再继续遍历下去。

        if root.val > val: 
            return self.searchBST(root.left, val)

这一段处理的是如果当前节点的值大于目标值的情况。由于二叉搜索树的性质,即左子树的所有节点的值都小于根节点的值,我们可以断定目标值 val 如果存在的话,一定在当前节点的左子树中。因此,递归地在左子树中继续搜索。

这里用到了递归调用 self.searchBST(root.left, val) 来实现左子树的搜索。

        if root.val < val: 
            return self.searchBST(root.right, val)

这一段处理的是如果当前节点的值小于目标值的情况。类似地,根据二叉搜索树的性质,右子树的所有节点的值都大于根节点的值,因此可以断定目标值 val 如果存在,一定在当前节点的右子树中。因此,递归地在右子树中继续搜索。

这里用递归调用 self.searchBST(root.right, val) 来实现右子树的搜索。

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值