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;
僞代碼解釋