📜  门| GATE CS 2021 |设置 2 |问题 24(1)

📅  最后修改于: 2023-12-03 15:42:12.942000             🧑  作者: Mango

门 | GATE CS 2021 |设置 2 |问题 24

本题为 GATE 计算机科学考试 2021 年设置的第 2 部分第 24 道题目。该题目考察了程序员对于二叉搜索树的操作及时间复杂度的理解和掌握程度。

题目描述

给定一个二叉搜索树和两个整数 n1 和 n2,求二叉搜索树中所有值在 n1 和 n2 之间(n1<n2)的结点的和。

输入格式
T
n [n个整数]
n1 n2
T1 [T1的构建]
T2 [T2的构建]
...
  • T 表示测试用例的数量。
  • n 表示 T1 和 T2 的结点数量。
  • n1 和 n2 表示需要计算的值的范围。
  • T1、T2 等表示二叉搜索树的构建,用一行数字表示树中的每个节点。如果一个节点没有左子树或右子树,用 -1 表示。
输出格式

对于每个测试用例,输出一行计算出的二叉搜索树中所有值在 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 之间的节点的和。因此我们需要采用二叉搜索树的性质进行计算,具体的步骤如下:

  1. 遍历二叉搜索树,如果当前结点的值在 n1 和 n2 之间,则将该节点的值加入到计算结果中;
  2. 如果当前结点的值小于 n1,则只需要遍历右子树;
  3. 如果当前结点的值大于 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])。

  • 在最坏情况下,即二叉搜索树呈现链形结构,并且所有节点都在范围 [a,b] 内,此时时间复杂度为 O(n)。
  • 在最好情况下,即范围 [a,b] 与二叉搜索树区域完全重合或者不重合的情况下,此时时间复杂度为 O(h)。