📜  门| GATE CS Mock 2018年|套装2 |问题24(1)

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

门 | GATE CS Mock 2018年 | 套装2 | 问题24

本题的主要内容涉及数据结构和算法,需要对二叉搜索树(BST)有一定的了解。

问题描述

给定一个BST和两个整数k1和k2,编写一个函数,返回所有在k1和k2之间(包括k1和k2)的BST节点的值。

输入

输入包含三部分:

  1. 第一行包含一个整数T,表示测试用例的数量。
  2. 对于每个测试用例,第一行包含一个整数N,表示BST中的节点数。 第二行包含N个整数,表示BST中的节点值。 第三行包含两个整数k1和k2。
  3. 按照上述格式,共T个测试用例。
输出

对于每个测试用例,将所有在k1和k2之间的BST节点值以递增顺序打印在一行中,并在每个测试用例后输出一个换行符。

例子

输入:

2  
5  
4 3 2 5 6  
2 5  
7  
10 5 50 1 40 100 200  
5 45  

输出:

2 3 4 5 
5 10 40 
解决方法

我们可以使用中序遍历BST并将节点值存储在一个数组中。我们然后将值从数组中得到k1和k2之间的所有节点的子集,并对其进行排序。最后,我们打印排序后的数组。

以下是Python实现的代码示例:

def elements_in_range(root, k1, k2):
    elements = []

    def helper(root):
        if not root: return
        if root.val > k1:
            helper(root.left)
        if k1 <= root.val <= k2:
            elements.append(root.val)
        if root.val < k2:
            helper(root.right)

    helper(root)
    return elements

# 测试代码
print(elements_in_range(root, k1, k2))

以下是C ++实现的代码示例:

void elements_in_range(Node *root, int k1, int k2)
{
    if (!root) return;
    if (k1 < root->data)
        elements_in_range(root->left, k1, k2);
    if (k1 <= root->data && k2 >= root->data)
        cout << root->data << " ";
    if (k2 > root->data)
        elements_in_range(root->right, k1, k2);
}

// 测试代码
elements_in_range(root, k1, k2);
时间和空间复杂度

使用这种方法的时间复杂度为O(n),其中n是BST的节点数。由于我们存储了中序遍历的结果,空间复杂度为O(n)。