散布树中值的范围函数?

时间:2019-03-15 00:46:01

标签: algorithm data-structures binary-search-tree pseudocode splay-tree

我是数据结构的初学者。 我正在尝试为带有展开树的范围函数编写一些伪代码:Range(S, A, B),它将伪代码更改为所有键值C满足A≤C≤B的所有成员的集合。成为二叉搜索树的类型并实现自己的展开操作。基本上,我试图返回介于A和B之间的值的范围。但是,我在理解如何执行此操作,甚至应从何处开始以及应检查哪些条件方面遇到困难。我已经阅读了展开树的定义,并且知道它们就像是采用前移算法的二进制搜索树。

这是我到目前为止所拥有的:

Algorithm Range(Array S, int A, int B): array Set
S = new array(size) //Initialize an empty array of some size
if (A > B) then return NULL

在此之后,我感到有些失落。我不确定如何检查八角树的值。请让我知道我是否可以提供其他信息,或者应该选择什么方向。

2 个答案:

答案 0 :(得分:0)

根据Wikipedia

  

展开树是一种自我调整的二进制搜索树,具有最近访问的元素可以快速再次访问的附加属性。它在O(log n)摊销时间内执行基本的操作,例如插入,查找和删除。

但是,由于“展开”操作仅适用于随机搜索,因此该树可以被视为普通的“二进制搜索树”。

算法变为

Range (BSTree T, int A, int B)
  int Array S

  S ← Empty array
  If A <= B then
    For each C in T
      If A <= C and C <= B then
        Append C to S
  Return S

也就是说,树T按顺序遍历;然后,对于满足条件的每个项目C,都将其添加到数组S中。如果没有满足条件的项目,则返回一个空数组。

如果For each在实现语言中不可用,则可以使用描述为in-order的算法来实现

inorder(node)
  if (node = null)
    return
  inorder(node.left)
  visit(node)
  inorder(node.right)

其中vist(node)是测试项目是否符合条件的地方。

答案 1 :(得分:0)

这已经很晚了,但是从问题提示中的“更改”一词看来,似乎是在要求您修改S树,使其仅包含范围内的元素。

所以我会这样做:将树展开到下限附近,并放下左子树,因为左子树中的所有值都将比下限更低。然后展开围绕上限的树,然后删除右子树,因为右子树中的所有值都将高于上限。

这是我用伪代码编写的方式

//assumes S is the root of an actual tree with elements
function Range(node S, int A, int B)
    node temp <- Splay(k1, S) //splay around lower bound
    if (temp.key < k1) //makes sure that there are elements in tree that satisfies this
        temp <- temp.right
        if (temp == null) return //there are no key greater than A, abort!
        temp <- Splay(temp.key, S)

    temp.left <- null //drops left subtree, bc they are all going to be lesser value
    temp <- Splay(k2, temp) //splay around upper bound
    if (temp.key > k2)
        temp <- temp.left
        if (temp == null) return //there are no keys less than B, abort!
        temp <- Splay(temp.key, temp)

    temp.right <- null //drops all right subtree
    S <- temp

希望这会有所帮助!这也应该在O(logn)中运行