我是数据结构的初学者。
我正在尝试为带有展开树的范围函数编写一些伪代码: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
在此之后,我感到有些失落。我不确定如何检查八角树的值。请让我知道我是否可以提供其他信息,或者应该选择什么方向。
答案 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)中运行