OS树的本质市对红黑树这种数据结构的简单扩张,在每个节点中又加入了x.size属性,表示以x为跟的子树中节点的个数(包括根节点x本身)
显然有 x.size = x.left.size+x.right.size+1;
OS树的目的就是为了实现在O(lgn)的时间内来进行顺序统计量的查询
1)查找给定秩的元素,OS-SELECT(x,i)返回一个指针,指向以x为根的子树中包含第i个关键字的节点。
OS-SELECT(x,i)
r = x.left+1;
if r==i
return x;
else i<r
return OS-SELECT(x.left,i)
else return OS-SELECT(x.right,i-r)
2)确定元素的秩,给定顺序统计树T中节点x的指针,OS-RANK返回对T中序遍历对应的线性序中x的位置
OS-RANK(T,x)
r = x.left+1;
while x!=T.root
if x == x.p.right // 如果x为父节点的右子树
r = r+x.p.left.size+1
x = x.p
return r;