Splay

来源:互联网 发布:电脑怎么恢复数据 编辑:程序博客网 时间:2024/04/20 20:55
</pre><pre name="code" class="cpp">
#include <cstdio>#include <cstdlib>using namespace std;typedef struct Splaynode *Splay;typedef struct Splaynode{ Splay r,l; int key;}Splaynode;void Splay L(Splay p){Splay q; q=p->r; p->r=q->l; q->l=p; p=q;}void Splay R(Splay p){Splay q; q=p->l; p->l=q->r; q->r=p; p=q;}Splay splay(int tkey,Splay p){  Splaynode Header; Splay Lax,Rin; Header.l=Header.r=NULL; Lax=Rin=&Header;  while(tkey!=p->key){    if(tkey<p->key){      if(tkey<p->l->key) L(p);       if(p->l==NULL) break;      Rin->l=p; Rin=p; p=p->l;    }    else if(tkey>p->key){      if(tkey>p->r->key) R(p);      if(p->r==NULL) break;      Lax->r=p; Lax=p; p=p->r;    }else break;    Lax->r=p->l; Rin->l=p->r; p->l=Header.r; p->r=Header.l;  }  return p;}Splay Insert(int tkey,Splay p){  Splay New; New=(Splay) malloc(sizeof(Splaynode));  if(p==NULL) {New->l=New->r=NULL; New->key=tkey; p=New;}  else{    p=splay(tkey,p);    if(tkey<p->key){New->l=p->l; New->r=p; p->r=NULL; p=New;}    else if(tkey>p->key){New->r=p->r; New->l=p; p->l=NULL; p=New;}    free(New); return p;  }}Splay Remove(int tkey,Splay p){  Splay New;  if(p!=NULL){    p=splay(tkey,p);    if(tkey==p->key){      if(p->l==NULL) New=p->r; else{New=p->l; New=splay(tkey,New); New->r=p->r;}      free(p); p=New;    }  }  return New;}int main(){return 0;}


参考:http://www.cnblogs.com/kuangbin/archive/2012/10/07/2714068.html


0 0