题目中给的数据范围明确说明了长度是偶数,偶数的长度更容易分隔。题目中有要求后序遍历,那么可以从下向上进行是FBI的输出,又易知根是FBI的哪一种取决于子树的类型是否相同。
这样只需要让子节点将类型返回就可以简单地得到当前节点是什么类型。
#include <bits/stdc++.h>


using namespace std;

int len;
char s[1024+10];

char deal(int l, int r) {
//	cout<<l<<" "<<r<<endl;
    if (l==r) {
        if (s[l]=='1') {
            printf("I");
            return 'I';
        } else {
            printf("B");
            return 'B';
        }
    }
    //向左子树走
    char zuo = deal(l, (r+l)/2);
    //向右子树走
    char you = deal((l+r)/2+1, r);
    if (zuo==you) {
        printf("%c", zuo);
        return zuo;
    } else {
        printf("F");
        return 'F';
    }
}

int main() {
    int N;
    cin>>N;
    len = pow(2,N);
    scanf("%s", s+1);
//    printf("%s\n", s+1);
    deal(1, len);
    return 0;
}