1 #include<stdio.h> 2 #include<math.h> 3 #define MAX 10000 4 int num[MAX]; 5 char s[MAX]; 6 //定义结构体 7 struct Node{ 8 Node *left,*right; 9 char c; 10 }; 11 //将字符数组转为整形数组 12 void strtoint(char *s, int *num, int len) { 13 for(int i=0;i<len;i++){ 14 num[i] = s[i] - '0'; 15 } 16 } 17 //后序遍历:递归遍历左右子树 18 void lastdfs(Node *head){ 19 if(head->left) 20 lastdfs(head->left); 21 if(head->right) 22 lastdfs(head->right); 23 printf("%c",head->c); 24 } 25 //判断并返回01串是否为全0、全一、混合串 26 char fbi(int *num,int begin,int end){ 27 int sum=0; 28 for(int i=begin;i<=end;i++) { 29 sum+=num[i]; 30 } 31 if(sum==0) return 'B';//全0串 32 else if(sum==end-begin+1) return 'I';//全1串 33 else return 'F';//混合串 34 } 35 //建立二叉树 36 Node *buildTree(int *num, int begin, int end){ 37 char c = fbi(num,begin,end); 38 Node *p = new Node; 39 p->c = c; 40 if(begin<end){//说明子串不为空 41 int mid = (begin+end)/2; 42 p->left = buildTree(num,begin,mid); 43 p->right = buildTree(num,mid+1,end); 44 }else{//若子串为空,左右子树赋NULL 45 p->left=NULL; 46 p->right=NULL; 47 } 48 return p; 49 } 50 int main(){ 51 int n; 52 scanf("%d",&n); 53 getchar();//处理回车 54 gets(s); 55 int len = pow(2,n);//按题意"01"串的长度为2的n次方 56 strtoint(s,num,len); 57 Node *head = buildTree(num,0,len-1); 58 lastdfs(head); 59 return 0; 60 }