真的说,有的时候思路是很重要的,坐这道题的时候一直钻进死胡同里面,然后一直出不来,所幸我就几天没有看,然后今天又再次看了一下,一想竟然出来了,有的时候真的需要一点灵感的啊!
#include<iostream>//空树海没有考虑呢!
#include<cstring>
using namespace std;
typedef struct fun
{
int stage,l,r;
}rr;
fun a[30];
void found(int root,int r)//老是当作递归来写的啊!
{
int i,rt,k;
for(k=r; k>=1; k--)
{
for(i=0; i<26; i++)
{
if(a[i].stage==k)
{
rt=root;
while(1)//不断的循环找到那个位置的
{
if(i<rt)
{
if(a[rt].l==-1)
{
a[rt].l=i;
break;
}
else
rt=a[rt].l;
}
else
{
if(a[rt].r==-1)
{
a[rt].r=i;
break;
}
else
rt=a[rt].r;
}
}
}
}
}
}
void vis(int k)
{
printf("%c",k+65);
if(a[k].l!=-1)
vis(a[k].l);
if(a[k].r!=-1)
vis(a[k].r);
}
int main()
{
int i,k=0;
char s[30];
while(1)
{
scanf("%s",s);
int len=strlen(s);
if(len==1 && (s[0]=='*'|| s[0]=='$'))
{
for(i=0; i<26; i++)
if(a[i].stage==k)//找到根所在的地方的
break;
if(i!=26)//判断是否是空树的,因为这个可能是临街的情况的
{
found(i,k-1);
vis(i);
printf("\n");
}
if(s[0]=='*')//判断是新一轮的开始,还是程序就要结束了
{
k=0;
for(i=0; i<26; i++)
a[i].stage=0;
}
else
break;//结束啦!
}
else
{
++k;
for(i=0; i<len; i++)//这个是输入字符串的长的得
{
a[s[i]-65].stage=k;//记录的是登记的
a[s[i]-65].l=a[s[i]-65].r=-1;//做初始化的
}
}
}
return 0;
}