哈尔滨理工大学2016新生赛G题
FBI Tree的描述如下:
我们可以把由0和1组成的字符串分为3类,全0的串成为B串,全1的串成为I串,既含0又含1的串则称为F串。FBI树是一种二叉树,它的节点类型也包括F串节点、B串节点和I串节点三种。由一个 长度为2^N的01串S可以构造出一颗FBI树T,递归的构造方法如下:
(1) T的根节点为R,其类型与串S的类型相同。
(2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给出一个长度为2^N的01串,请用上述构造方法构造出一棵FBI树,并输出它的后续遍历序列。
Input
第一行为一个正整数T,表示测试数据组数。
每组测试数据第一行为一个整数N(0 <= N <= 10),第二行是一个长度为2^N的01串。
Output
输出FBI树的后续遍历序列。
Sample Input
2
1
10
3
10001011
Sample Output
IBF
IBFBBBFIBFIIIFF
利用指针建立二叉树,再进行后续遍历。
直接构造一棵二叉树即可,可以用最后一层节点来保存2^N个值,则他们的父亲结点的字符值就已经由左右儿子的B,I决定了,故不用保存串,只需要记录字符值。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 char s1[2]="0",s2[2]="1"; 7 char s[1200]; 8 9 struct FBI 10 { 11 char s; 12 FBI *lchild,*rchild; 13 }; 14 15 void showtree(FBI *head)//后序遍历树 16 { 17 if(head==NULL) 18 return; 19 showtree(head->lchild); 20 showtree(head->rchild); 21 printf("%c",head->s); 22 } 23 24 void maketree(FBI *node,char *p,int len) 25 { 26 if(len==1) 27 { 28 if(strstr(p,s1)&&strstr(p,s2)) 29 node->s='F'; 30 else if(strstr(p,s1)&&!strstr(p,s2)) 31 node->s='B'; 32 else if(!strstr(p,s1)&&strstr(p,s2)) 33 node->s='I'; 34 node->lchild=NULL; 35 node->rchild=NULL; 36 return; 37 } 38 char q[520],*r=new char; 39 FBI *z=new FBI; 40 strncpy(q,p,len/2); 41 r=p; 42 int i=len/2; 43 while(i--) 44 r++; //将p一分为二 q和r两个字符串 45 if(strstr(q,s1)&&strstr(q,s2)) //判断左儿子的类型 46 z->s='F'; 47 else if(strstr(q,s1)&&!strstr(q,s2)) 48 z->s='B'; 49 else if(!strstr(q,s1)&&strstr(q,s2)) 50 z->s='I'; 51 node->lchild=z; 52 FBI *c=new FBI; 53 if(strstr(r,s1)&&strstr(r,s2)) //判断右儿子的类型 54 c->s='F'; 55 else if(strstr(r,s1)&&!strstr(r,s2)) 56 c->s='B'; 57 else if(!strstr(r,s1)&&strstr(r,s2)) 58 c->s='I'; 59 node->rchild=c; 60 maketree(z,q,len/2); //递归构建 61 maketree(c,r,len/2); 62 } 63 64 int main() 65 { 66 int T; 67 scanf("%d", &T); 68 while(T--) 69 { 70 int n; 71 scanf("%d", &n); 72 scanf("%s",&s); 73 if(strlen(s)==1) 74 { 75 if(!strcmp(s,"0")) 76 printf("B\n"); 77 else if(!strcmp(s,"1")) 78 printf("I\n"); 79 continue; 80 } 81 FBI *head=new FBI; 82 char s1[2]="0",s2[2]="1"; 83 if(strstr(s,s1)&&strstr(s,s2)) 84 head->s='F'; 85 else if(strstr(s,s1)&&!strstr(s,s2)) 86 head->s='B'; 87 else if(!strstr(s,s1)&&strstr(s,s2)) 88 head->s='I'; 89 maketree(head,s,(int)pow(2.0,(double)n)); 90 showtree(head); 91 printf("\n"); 92 } 93 return 0; 94 }