数据结构的扩张

来源:互联网 发布:万能变号王软件2017 编辑:程序博客网 时间:2024/04/29 00:09

顺序统计树:

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;}

原创粉丝点击