二叉搜索树的范围和

1.题目

这道题是2024-2-26的签到题,题目难度为简单。

考察知识点:二叉搜索树

题目链接:938. 二叉搜索树的范围和 - 力扣(LeetCode)

2.内容更改

之前的博客为了水字数就将题目也复制到博客中,相信大家每次也是跳过那一段直接看思路和代码,因此之后小徐只会写核心内容。

3.思路

二叉搜索树的概念

这道题还是考察我们对二叉搜索树的理解,我们还是复习一下二叉搜索树的概念,对于二叉搜索树的任何一个结点,它都满足:左子结点的值小于根节点的值,右子结点的值大于根节点的值。如图所示:

整体思路

对于这道题,它给我们一个数值范围[low,high],让我们找到所有在这个范围的值和。说到底这道题还是让我们找到所有在这个范围值的结点,只不过我们需要将他们的和相加起来,因此我们可以借助下面的思路来解题:

首先,我们定义一个遍历函数find,传入的参数就为结点的类型(TreeNode),如果结点为空,直接返回0;如果结点不为空,我们就判断当前结点的值,无非就下面三种情况:

  • 当前结点的值小于Low
  • 当前结点的值在low和high之间
  • 当前结点的值大于high

如果当前结点的值小于low,我们就要停止递归了吗?不,根据二叉搜索树的概念,它的右子结点的值还是大于当前节点的值,我们无法判断它的右子节点的值是否小于low,因此我们需要遍历它的右子节点。

如果当前结点的值大于high,我们根据前面的理解,它的左子结点的值可能在low和high之间,因此我们需要遍历它的左子结点。

如果当前结点的值在low和high之间,我们可以直接将当前结点的值返回。难道这就没了吗?我们还要考虑它的左右子节点遍历后的结果,因此还要将它的左右子节点遍历的结果加上去,这样才算是整棵树的结果。

4.代码

# 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 = right
class Solution:
    def rangeSumBST(self, root: Optional[TreeNode], low: int, high: int) -> int:
        # 定义遍历函数
        def find(node):
            # 如果结点不为空
            if node:
                # 如果当前结点的值大于high
                if node.val > high:
                    # 返回遍历它的左子结点的结果
                    return find(node.left)
                # 如果当前结点的值小于low
                elif node.val < low:
                    # 返回遍历它的右子节点的结果
                    return find(node.right)
                # 如果当前结点的值>=low同时<=high
                elif node.val >= low and node.val <= high:
                    # 返回当前结点的值 + 遍历左子结点的值 + 遍历右子节点的值
                    return node.val + find(node.left) + find(node.right)
            # 否则返回0
            return 0
        return find(root)

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小人物₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值