Fancy Mouse
- -|||
在思考这题的时候想到了一个很好的解法。
建立一棵用数组模拟的树,每个结点的值类型是一个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);
    }

}
posted on 2005-10-28 16:27  Fancy Mouse  阅读(287)  评论(1编辑  收藏  举报