数据额结构查找表的难题
详细参考课本,总之就是四种旋转 LL RR LR RL 后两种建立在前两种旋转的基础上。取孩子节点,把孩子节点的孩子节点连到夫节点的孩子节点,再把父节点连到孩子节点上。
甩代码
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
struct bt
{
int data,b;
struct bt *lc,*rc;
};
int deep(bt *t)
{
if(t==NULL)
return -1;
return t->b;
}
bt * LL(bt *p)
{
bt *q=p->lc;
p->lc=q->rc;
q->rc=p;
p->b=max(deep(p->lc),deep(p->rc))+1;
q->b=max(deep(q->lc),deep(q->rc))+1;
return q;
}
bt * RR(bt *p)
{
bt *q=p->rc;
p->rc=q->lc;
q->lc=p;
p->b=max(deep(p->lc),deep(p->rc))+1;
q->b=max(deep(q->lc),deep(q->rc))+1;
return q;
}
bt * LR(bt *p)
{
p->lc=RR(p->lc);
return LL(p);
}
bt * RL(bt *p)
{
p->rc=LL(p->rc);
return RR(p);
}
void crebt(struct bt *&t,int k)
{
if(t==NULL)
{
t=(struct bt *)malloc(sizeof(struct bt));
t->b=0;
t->data=k;
t->rc=t->lc=NULL;
}
if(k<t->data)
{
crebt(t->lc,k);
if(deep(t->lc)-deep(t->rc)==2)
{
if(k<t->lc->data)
t=LL(t);
else
t=LR(t);
}
}
else if(k>t->data)
{
crebt(t->rc,k);
if(deep(t->lc)-deep(t->rc)==-2)
{
if(k>t->rc->data)
t=RR(t);
else
t=RL(t);
}
}
t->b=max(deep(t->lc),deep(t->rc))+1;
}
int main()
{
int n,x;
scanf("%d",&n);
struct bt *root=NULL;
for(int i=0; i<n; i++)
{
scanf("%d",&x);
crebt(root,x);
}
printf("%d",root->data);
}