在思考这题的时候想到了一个很好的解法。
建立一棵用数组模拟的树,每个结点的值类型是一个char,内容是ABC中的一个。先把原01串处理为AB串并作为叶子结点,然后两个两个合并。合并的时候,两结点全A或全B时,父结点值为A或B,否则为C。树建立起来以后,先序遍历即可。注意只有在一个结点的值为C的时候才访问左右孩子。
建立一棵用数组模拟的树,每个结点的值类型是一个char,内容是ABC中的一个。先把原01串处理为AB串并作为叶子结点,然后两个两个合并。合并的时候,两结点全A或全B时,父结点值为A或B,否则为C。树建立起来以后,先序遍历即可。注意只有在一个结点的值为C的时候才访问左右孩子。
#include<iostream>
#include<cstring>
using namespace std;
const int K = 0x20000;
void PrintTree(char s[2*K],int current);
int length;
int main()
{
char s[2*K];
int ptEnd,ptStart;
while(cin>>s)
{
ptStart = 0;
ptEnd = strlen(s);
length = ptEnd * 2 - 1;
for(int i=0;i<ptEnd;i++) s[i] = s[i] - '0' + 'A';
while(ptStart + 2 <= ptEnd)
{
if(s[ptStart] != 'C' && s[ptStart] == s[ptStart+1])
s[ptEnd++] = s[ptStart];
else
s[ptEnd++] = 'C';
ptStart += 2;
}
PrintTree(s,1);
cout<<endl;
}
return 0;
}
void PrintTree(char s[2*K],int current)
{
cout<<s[length-current];
if(s[length-current] == 'C')
{
current <<= 1;
PrintTree(s,current+1);
PrintTree(s,current);
}
}
#include<cstring>
using namespace std;
const int K = 0x20000;
void PrintTree(char s[2*K],int current);
int length;
int main()
{
char s[2*K];
int ptEnd,ptStart;
while(cin>>s)
{
ptStart = 0;
ptEnd = strlen(s);
length = ptEnd * 2 - 1;
for(int i=0;i<ptEnd;i++) s[i] = s[i] - '0' + 'A';
while(ptStart + 2 <= ptEnd)
{
if(s[ptStart] != 'C' && s[ptStart] == s[ptStart+1])
s[ptEnd++] = s[ptStart];
else
s[ptEnd++] = 'C';
ptStart += 2;
}
PrintTree(s,1);
cout<<endl;
}
return 0;
}
void PrintTree(char s[2*K],int current)
{
cout<<s[length-current];
if(s[length-current] == 'C')
{
current <<= 1;
PrintTree(s,current+1);
PrintTree(s,current);
}
}