zoukankan      html  css  js  c++  java
  • 哈尔滨理工大学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
    "); 
    77             else if(!strcmp(s,"1")) 
    78             printf("I
    "); 
    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("
    "); 
    92     } 
    93     return 0; 
    94 }
  • 相关阅读:
    小朋友学数据结构(2):栈
    小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法
    小朋友学C++(2)
    小朋友学C++(1)
    小朋友学C语言(8)
    小朋友学C语言(7)
    小朋友学C语言(6)
    小朋友学C语言(5):常量和变量,for循环
    小朋友学C语言(4):单精度浮点数与双精度浮点数
    小朋友学C语言(3):整数、浮点数、字符
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/6105753.html
Copyright © 2011-2022 走看看