心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
最近对树型数据结构特别感兴趣!
以下是我的Splay树代码:
#include<stdio.h>
#define maxn 10007
typedef 
struct
{
    
long data,fa,ls,rs;
}Node;
Node splay[maxn];
long m,root;
long n;
void Zig(long node)
{
    
long t=splay[node].fa;
    splay[t].rs
=splay[node].ls;
    
if(splay[node].ls)
      splay[splay[node].ls].fa
=t;
    splay[node].fa
=splay[t].fa;
    splay[node].ls
=t;
    
if(splay[t].fa)
    {
       
if(t==splay[splay[t].fa].ls) splay[splay[t].fa].ls=node;
       
else splay[splay[t].fa].rs=node;
    }
    splay[t].fa
=node;
}
void Zag(long node)
{
    
long t=splay[node].fa;
    splay[t].ls
=splay[node].rs;
    
if(splay[node].rs)
      splay[splay[node].rs].fa
=t;
    splay[node].fa
=splay[t].fa;
    splay[node].rs
=t;
    
if(splay[t].fa)
    {
       
if(t==splay[splay[t].fa].ls) splay[splay[t].fa].ls=node;
       
else splay[splay[t].fa].rs=node;
    }
    splay[t].fa
=node;
}
void Splay(long node)
{
    
long t;
    
while(splay[node].fa)
    {
       t
=splay[node].fa;
       
if(splay[t].fa==0)
       {
          
if(node==splay[t].ls) Zag(node);
          
else Zig(node);
          
break;
       }
       
if(t==splay[splay[t].fa].ls)
       {
          
if(node==splay[t].ls)
          {Zag(t);Zag(node);}
          
else {Zig(node);Zag(node);}
       }
       
else
       {
          
if(node==splay[t].ls)
          {Zag(node);Zig(node);}
          
else {Zig(t);Zig(node);}
       }
    }
    root
=node;
}
void Insert(long x)
{
    
long p,q;
    m
++;
    splay[m].data
=x;
    splay[m].fa
=splay[m].ls=splay[m].rs=0;
    
if(root==0)
    {
       root
=m;return;
    }
    
for(p=root;p; )
    {
       q
=p;
       
if(x<=splay[p].data) p=splay[p].ls;
       
else p=splay[p].rs;
    }
    splay[m].fa
=q;
    
if(x<=splay[q].data) splay[q].ls=m;
    
else splay[q].rs=m;
    Splay(m);
}
int main()
{
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    scanf(
"%ld",&n);
    m
=root=0;
    
for(long i=1;i<=n;i++)
      splay[i].data
=splay[i].fa=splay[i].ls=splay[i].rs=0;
    
for(long i=1;i<=n;i++)
    {
       
long t;
       scanf(
"%ld",&t);
       Insert(t);
    }
    Splay(
1);
    
for(long i=1;i<=n;i++)
    printf(
"No.%ld data.%ld fa.%ld ls.%ld rs.%ld\n",i,splay[i].data,splay[i].fa,splay[i].ls,splay[i].rs);
return 0;
}

posted on 2010-03-12 22:28 lee1r 阅读(956) 评论(0)  编辑 收藏 引用 所属分类: 算法与数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理