• 题目考点:分治(二分)
  • 题目内容:给出一个01串,将其不断二分成一颗二叉树,求后序遍历;遍历过程中,若某一节点儿子均为1,输出‘I’,若均为0,输出‘F’,否则输出‘F’;
  • 题目分析:如题目样例:
    3
    10001011
    则有:
    图片说明
#include<iostream>
#include<algorithm>

using namespace std;

int n;
string s;

char FBI(int l, int r)
{
    if(l == r) //若已经到了叶子节点,直接返回
    {
        if(s[l] == '0')
        {
            cout<<'B'; return 'B';
        }
        if(s[l] == '1')
        {
            cout<<'I'; return 'I';
        }
    }
    int mid = l + r >> 1; //没有到叶子结点,继续二分
    char sonl = FBI(l+1-1, mid);
    char sonr = FBI(mid + 1, r);
    //根据儿子节点的情况输出并返回
    if((sonl == 'F' || sonr == 'F') || sonl != sonr)
    {
        cout<<'F'; return 'F';
    }
    if(sonl == 'I')
    {
        cout<<'I'; return 'I';
    }
    cout<<'B'; return 'B';
}

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