我有一个订单统计增强红黑树。
它在大多数情况下都有效。但我需要实现一个快速函数(O(lg n)),它主要按排序顺序返回节点的位置。就像我教科书中的 OS-rank 函数一样。但有一个转折:如果两个节点具有相同的分数,则返回值应该相同。这是 os-rank 函数(在伪代码中,对于给定的节点 x,其中 root 是树的根)。
OS-Rank(x)
r=x.left.size+1
y=x
while y!=root
if y==y.p.right
r+=y.p.left.size+1
y=y.p
return r
但是:我需要的是,如果 A 有键 1 而节点 B 有键 1,则函数对两者都返回 1。等等。我尝试过这样的事情。
rank(x)
start with value r=1
check that x.right is not Nil
case x.right has the same key as x
add x.right.#nodeswithkeyhigher(x.key) to r
other cases: add x.right.size to r
y=x
while y != root
if y.parent.left == y
case y.parent.right.key>x.key
add y.parent.right to r
other cases
add y.parent.right.#nodeswithkeyhigher(x.key) to r
y=y.parent
return r
你猜怎么着:一个测试用例失败了。我想知道这是否是一种正确的做事方式,或者我是否犯了一些我没有看到的错误(否则错误出现在 Node.#nodeswithkeyhigher(key) 函数中)。