题目大意是根据一组一组离根节点的操作确定子节点。
思路:根据操作直接推出节点的编号,将编号和值存在数组中建立二叉树。
#include<bits/stdc++.h>
using namespace std;
int vis[100000]={0},tree[100000]={0};
char s5[100000];
int main()
{ // freopen("123.in","r",stdin);
//freopen("123.out","w",stdout);
while(1)
{
string s;
int flag1=0,n=0;
char a;
memset(s5,0,sizeof(s5));
string s1;
while(!strstr(s5,"()"))
{ //本题的输入还是有点难度的
if((a=getchar())==EOF)
{flag1=1;
break;
}
s5[n++]=a;
}
if(flag1)break;
s5[n]='\0';
s1=s5;
string s3;
stringstream ss(s1);
int maxx=0,flag=0;
memset(vis,0,sizeof(vis));
memset(tree,0,sizeof(tree));
while(ss>>s)
{
if(s=="()")break;
int v;
sscanf(&s[1],"%d",&v);
//printf("%d\n",v);
int k=1;
for(int i=0;i<s.length();i++)
{ if(s[i]=='L')
{
k=2*k; //根据操作确定编号
}
else if(s[i]=='R')
{
k=k*2+1;
}
}
if(!vis[k])
{vis[k]=1;
tree[k]=v;
if(maxx<k)
maxx=k; //更新记录总节点个数
}
else
{
flag=1;
break;
}
}
for(int i=2;i<=maxx;i++)
{
if(vis[i])
{int x=i;
if(x%2==0)x/=2;
else if(x%2)x=(x-1)/2; //除根节点外向上遍历检查是否存在该点的 父节点,如果没有则是不完整的
if(vis[x]==0)
{
flag=1;break;
}
}
}
if(flag)
{
printf("not complete");
}
else
{
for(int i=1;i<=maxx;i++)
{
if(vis[i]==1)
{
cout<<tree[i];
if(i!=maxx)
printf(" ");
}
}
}
printf("\n");
memset(s5,0,sizeof(s5));
}
}