📅  最后修改于: 2023-12-03 15:42:12.942000             🧑  作者: Mango
本题为 GATE 计算机科学考试 2021 年设置的第 2 部分第 24 道题目。该题目考察了程序员对于二叉搜索树的操作及时间复杂度的理解和掌握程度。
给定一个二叉搜索树和两个整数 n1 和 n2,求二叉搜索树中所有值在 n1 和 n2 之间(n1<n2)的结点的和。
T
n [n个整数]
n1 n2
T1 [T1的构建]
T2 [T2的构建]
...
对于每个测试用例,输出一行计算出的二叉搜索树中所有值在 n1 和 n2 之间的节点的和。
2
5 1 4
20 10 30 5 15 25 35 -1 -1 -1 -1 -1 -1 -1 -1
7 9 12
10 7 15 3 8 -1 18 -1 -1 -1 -1 -1 -1
19
22
该题目需要计算二叉搜索树中所有值在 n1 和 n2 之间的节点的和。因此我们需要采用二叉搜索树的性质进行计算,具体的步骤如下:
根据以上的思路,我们可以得到一个计算二叉搜索树节点值之和的算法,具体实现如下:
def range_sum(root, n1, n2):
if root is None:
return 0
# 如果节点值小于n1,则递归遍历它的右子树
if root.val < n1:
return range_sum(root.right, n1, n2)
# 如果节点值大于n2,则递归遍历它的左子树
if root.val > n2:
return range_sum(root.left, n1, n2)
# 如果节点值在n1和n2之间,则将该节点值加入计算结果中,
# 并且递归遍历它的左子树和右子树
return root.val + range_sum(root.left, n1, n2) + range_sum(root.right, n1, n2)
假设二叉搜索树的深度为 h,并且 n1 和 n2 的范围是 [a, b],那么以上算法的时间复杂度为 O(h+number of nodes inside the range [a,b])。