九度 題目1541:二叉樹
阿新 • • 發佈:2019-02-12
二叉樹的操作,旋轉操作就按他給的圖來進行吧,需要細心,要把各節點的兒子父親安排的妥妥的.還有不知道他是一棵還是多棵二叉樹...
#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; }