OS-SELECT(x,i)
int r=x.left.size+1;
if(i==r)
{
return x;
}
esle
if(i<r)
return OS-SELECT(x.left,i);
else
return OS-SELECT(X.right,i-r);
伪代码解释
为明白OS-SELECT是如何操作的,在上图所示的顺序统计图上查找第17小元素的查找过程。以X为根开始,其关键字为26。i=17.因为在26的左子树大小为12,故他的秩为13,因此,秩为17的节点是26的右子树第17-13=4小得瑟元素。递归调用后,x为关键字41的节点,i=4,因为41的左子树大小为5,故他的秩为6,这样,可以知道秩为秩为4的节点是41的左子树的第4小元素。再次递归调用后,x为关键字30的节点,在其子树中他的秩为2,如此,再进行一次递归调用,就能找到以关键字38的节点为根的子树中第4-2=2小的元素。他的左子树大小为1,这意味着他就是第2小的元素。最终,该过程返回一个指向关键字38的节点的指针。
## 确定一个元素的秩 ##
给定指向顺序统计树T中节点x的指针,过程OS-RANK返回对T中序遍历对应的线性序中X的位置。
OS-RANK(T,x)
int r=x.left.size+1;
int y=x;
while(y!=T.root)
{
if(y==y.p.right)
{
r=r+y.p.left.size+1;
}
y=y.p;
}
return r;
伪代码解释