PAT (Advanced Level) 1066. Root of AVL Tree (25)

Posted Fighting Heart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT (Advanced Level) 1066. Root of AVL Tree (25)相关的知识,希望对你有一定的参考价值。

AVL树的旋转。居然1A了....

了解旋转方式之后,数据较小可以当做模拟写。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<string>
#include<algorithm>
using namespace std;

const int maxn=30;
int n,a[maxn];
struct Node
{
    int num;
    int L,R;
    int LH,RH;
    int fa;
}node[maxn];
int sz;
int root;

void init()
{
    root=0;
    sz=0;
    node[root].fa=-1;
    node[root].L=-1,node[root].R=-1;
    node[root].num=a[1];
    node[root].LH=0,node[root].RH=0;
}

void dfs(int now)
{
    if(node[now].L!=-1) dfs(node[now].L);
    if(node[now].R!=-1) dfs(node[now].R);
    node[now].LH=max(node[node[now].L].LH,
                    node[node[now].L].RH)+1;
    node[now].RH=max(node[node[now].R].LH,
                    node[node[now].R].RH)+1;
}

void Update(int fa,int num,int tag)
{
    sz++;
    node[sz].fa=fa;
    node[sz].L=-1,node[sz].R=-1;
    node[sz].num=num;
    node[sz].LH=0,node[sz].RH=0;
    if(tag==1) node[fa].R=sz;
    else node[fa].L=sz;
    dfs(root);
}

void Insert(int num)
{
    int p=root;
    while(1)
    {
        if(num>=node[p].num)
        {
            if(node[p].R!=-1) p=node[p].R;
            else { Update(p,num,1); break; }
        }
        else
        {
            if(node[p].L!=-1) p=node[p].L;
            else { Update(p,num,0); break; }
        }
    }
}

void LL(int id)
{
    int Lson=node[id].L;

    Node tmp1=node[id];
    Node tmp2=node[Lson];

    if(tmp1.fa!=-1)
    {
        if(node[tmp1.fa].L==id) node[tmp1.fa].L=Lson;
        else node[tmp1.fa].R=Lson;
    }
    node[Lson].fa=tmp1.fa;

    node[Lson].R=id;
    node[id].fa=Lson;

    node[id].L=tmp2.R;
    node[tmp2.R].fa=id;
}

void RR(int id)
{
    int Rson=node[id].R;
    Node tmp1=node[id];
    Node tmp2=node[Rson];

    if(tmp1.fa!=-1)
    {
        if(node[tmp1.fa].L==id) node[tmp1.fa].L=Rson;
        else node[tmp1.fa].R=Rson;
    }

    node[Rson].fa=tmp1.fa;

    node[Rson].L=id;
    node[id].fa=Rson;

    node[id].R=tmp2.L;
    node[tmp2.L].fa=id;
}

void LR(int id)
{
    int Lson=node[id].L;
    RR(Lson);
    LL(id);
}

void RL(int id)
{
    int Rson=node[id].R;
    LL(Rson);
    RR(id);
}

void Rotate(int id)
{
    int need=-1;
    int p=node[id].fa;
    while(1)
    {
        if(p==-1) break;
        if(abs(node[p].LH-node[p].RH)>1) { need=p; break; }
        p=node[p].fa;
    }

    if(need==-1) return;

    if(node[need].LH>node[need].RH)
    {
        int Lson=node[need].L;
        if(node[Lson].LH>node[Lson].RH) LL(need);
        else LR(need);
    }

    else
    {
        int Rson=node[need].R;
        if(node[Rson].RH>node[Rson].LH) RR(need);
        else RL(need);
    }

    for(int i=0;i<=sz;i++) if(node[i].fa==-1) root=i;
    dfs(root);
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    init();
    for(int i=2;i<=n;i++)
    {
        Insert(a[i]);
        Rotate(sz);
    }

    printf("%d\n",node[root].num);

    return 0;
}

 

以上是关于PAT (Advanced Level) 1066. Root of AVL Tree (25)的主要内容,如果未能解决你的问题,请参考以下文章

PAT (Advanced Level) 1025. PAT Ranking (25)

PAT Advanced Level 1044

PAT Advanced Level 1043

PAT Advanced Level 1079

PAT Advanced Level 1095

PAT Advanced Level 1038