顺序统计树:
enum nodecolor {red,black};
struct os_node
{
int key;
os_node *left;
os_node *right;
os_node *p;
nodecolor color;
int size;
os_node(int a,nodecolor c=red,int s=1)
{
key=a;
color=c;
size=s;
}
};
static os_node *NIL=new os_node(0,black,0);
os_node* os_select(os_node *x,int i)
//寻找x为根顺序统计树中第i小关键字的结点指针,O(lgn)
{
int r=x->left->size+1;
if(i==r)
return x;
else if(i<r)
return os_select(x->left,i);
else
return os_select(x->right,i-r);
}
int os_rank(os_node *x,os_node *z)
//给定x为根的顺序统计树中的结点z,返回对x进行中序遍历后z的位置,即z的秩,O(lgn)
{
int r=z->left->size+1;
os_node *y=z;
while(y!=x)
{
if(y==y->p->right)
r=r+y->p->left->size+1;
y=y->p;
}
return r;
}
int os_key_rank(os_node *x,int k)
//给定树根x和关键字k,返回k的秩,
{
if(x->key==k)
return x->left->size+1;
else if(x->key>k)
return os_key_rank(x->left,k);
else
return x->left->key+1+os_key_rank(x->right,k);
}
区间树:
enum nodecolor {red,black};
class interval//区间
{
int low;
int high;
};
struct interval_node
{
interval inter;
int max;//以该结点为根的树中所有区间端点的最大值
interval_node *left;
interval_node *right;
interval_node *p;
nodecolor color;
interval_node(int l,int h,nodecolor c=red)
{
inter.low=l;
inter.high=h;
color=c;
}
};
static interval_node *NIL=new interval_node(0,0,black);
interval interval_search(interval_node *x,interval i)
//找出以x为根的区间树中覆盖区间i的那个结点
{
interval_node *y=x;
while(y!=NIL && (i.low>y->inter.high || i.high<y->inter.low))
{
if(y->left!=NIL && y->left->max>=i.low)
y=y->left;
else
y=y->right;
}
return y;
}