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)