首页 > 代码库 > 哈尔滨理工大学2016新生赛G题

哈尔滨理工大学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 }

 

哈尔滨理工大学2016新生赛G题