1. 程式人生 > >九度 題目1541:二叉樹

九度 題目1541:二叉樹

二叉樹的操作,旋轉操作就按他給的圖來進行吧,需要細心,要把各節點的兒子父親安排的妥妥的.還有不知道他是一棵還是多棵二叉樹...

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 2010
struct node
{
    int fa,lch,rch,size;
    void init()
    {
        fa=lch=rch=0;
        size=0;
    }
}root[N];

int n,q,R,val,a,b;
bool vis[N],fa[N];
char op[7];

inline int dfs(int now)
{
   // printf("%d z\n",now);
    int ans=1;
    if(root[now].lch!=-1)
    {
        ans+=dfs(root[now].lch);
    }
    if(root[now].rch!=-1)
    {
        ans+=dfs(root[now].rch);
    }
    return root[now].size=ans;
}

inline void zig(int t,int p)
{

    int val=root[p].size;
    root[p].size=root[p].size-root[t].size+root[root[t].rch].size;
    root[t].size=val;
    root[p].lch=root[t].rch;
    root[root[t].rch].fa=p;
    root[t].rch=p;
    if(fa[p])
    {
        fa[t]=1;
        fa[p]=0;
        root[t].fa=0;
        root[p].fa=t;
    }
    else
    {
        if(p==root[root[p].fa].lch)
        {
            root[root[p].fa].lch=t;
            root[t].fa=root[p].fa;
            root[p].fa=t;
        }
        else
        {
            root[root[p].fa].rch=t;
            root[t].fa=root[p].fa;
            root[p].fa=t;
        }
    }
}

inline void zag(int t,int p)
{
    int val=root[p].size;
    root[p].size=root[p].size-root[t].size+root[root[t].lch].size;
    root[t].size=val;
    root[p].rch=root[t].lch;
    root[root[t].lch].fa=p;
    root[t].lch=p;
    if(fa[p])
    {
        fa[p]=0;
        fa[t]=1;
        root[t].fa=0;
        root[p].fa=t;
    }
    else
    {
        if(p==root[root[p].fa].lch)
        {
            root[root[p].fa].lch=t;
            root[t].fa=root[p].fa;
            root[p].fa=t;
        }
        else
        {
            root[root[p].fa].rch=t;
            root[t].fa=root[p].fa;
            root[p].fa=t;
        }
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<N;i++) root[i].init(),vis[i]=0,fa[i]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            if(a>0)vis[a]=1;
            if(b>0)vis[b]=1;
            root[i].lch=a,root[i].rch=b;
            if(a>0) root[a].fa=i;
            if(b>0) root[b].fa=i;
        }
        for(int i=1;i<=n;i++)
        {
            if(vis[i]==0)
            {
                dfs(i);
                fa[i]=1;
            }
        }


        scanf("%d",&q);
        while(q--)
        {
            scanf("%s%d",op,&val);
            if(op[0]=='p')
            {
                if(fa[val])
                {
                    printf("-1\n");
                }
                else
                {
                    printf("%d\n",root[val].fa);
                }
            }
            else if(op[0]=='s')
            {
              //  dfs(R);
                printf("%d\n",root[val].size);
            }
            else
            {
                if(fa[val])
                {
                    continue;
                }
                int p=root[val].fa;
                if(root[p].lch==val)
                {
                    zig(val,p);
                }
                else
                {

                    zag(val,p);
                }
            }
        }
    }
    return 0;
}