FBI树

    科技2022-08-29  111

    测试地址:

    【题目描述】

    我们可以把由 “0” 和 “1” 组成的字符串分为三类:全 “0” 串称为 B 串,全 “1” 串称为 I 串,既含 “0” 又含 “1” 的串则称为 F 串。

    FBI 树是一种二叉树,它的结点类型也包括 F 结点,B 结点和 I 结点三种。由一个长度为 2N 的 “01” 串 S 可以构造出一棵FBI树T,递归的构造方法如下:

    T 的根结点为 R,其类型与串 S 的类型相同;

    若串 S 的长度大于 1,将串 S 从中间分开,分为等长的左右子串 S1 和 S2;由左子串 S1 构造 R 的左子树 T1,由右子串 S2 构造 R 的右子树 T2。

    现在给定一个长度为 2N 的 “01” 串,请用上述构造方法构造出一棵 FBI 树,并输出它的后序遍历序列。

    【输入】

    第一行是一个整数N(0≤N≤10),第二行是一个长度为 2N 的 “01” 串。

    【输出】

    一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

    【输入样例】

    3 10001011

    【输出样例】

    IBFBBBFIBFIIIFF 

    【提示】

    对于40%的数据,N≤2;

    对于100%的数据,N≤10。

    【AC代码】

    #include<iostream> #define N 3001 using namespace std; int n; char a[N], b[N]; void build(char *s,int n){ int k=0; //先把叶子结点赋值,0 为 B,1 为 I for(int i = (1<<n); i <= (1<<(n+1))-1; i++){ if(a[k++] == '0') b[i] = 'B'; else b[i] = 'I'; } //根据底层结点确定上一层结点 for(int i = n-1; i >= 0; i--) for(int j = (1<<i); j <= (1<<(i+1))-1; j++){ if(b[2*j]=='B' && b[2*j+1]=='B') b[j] = 'B'; else if(b[2*j]=='I' && b[2*j+1]=='I') b[j] = 'I'; else b[j] = 'F'; } } void visit(int node){ // 后序遍历 if(node > (1 << (n+1))-1) return; visit(node*2); visit(node*2+1); cout << b[node]; } int main(){ cin >> n >> a; build(a, n); visit(1); return 0; }

     

    Processed: 0.009, SQL: 10