思路

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

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

意思就是如果这个串都是0那根节点就是B,都是1根结点就是I,有0也有1根节点就是F

树的遍历通常都是用递归实现,这里左子树和右子树的长度相同,所以对一个字符串来说可以递归分成两个部分

(l,(l+r)>>1)和(1+((l+r)>>1)),r)
接下来输出就行

代码

#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define pb push_back
#define pll pair<ll,ll>
#define INF 0x3f3f3f3f
const int mod = 1e9+7;
const int maxn = 10005;
#define stop system("pause")

int n;
string s;
void dfs(int l, int r) {
    if (l == r) {
        if (s[l] == '1')    cout << 'I';
        else if (s[l] == '0')    cout << 'B';
        return;
    }
    int flag1 = 0, flag2 = 0;
    int mid = l + r >> 1;
    dfs(l, mid), dfs(mid + 1, r);
    for (int i = l; i <= r; ++i) {
        if (s[i] == '0')    flag1 = 1;
        else if (s[i] == '1')    flag2 = 1;
    }
    if (flag1 && flag2)    cout << 'F';
    else if (flag1)    cout << 'B';
    else if (flag2)    cout << 'I';
}

int main() {
    cin >> n >> s;
    dfs(0, s.size() - 1);
    return 0;
}