P1087 [NOIP2004 普及组] FBI 树

题目传送门

一、样例解读

二、C++代码

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;

int n, m;
string s; //2^n长度的01串

/**
 * 功能:获取字符串s的类型
 * @param s
 * @return
 */
char getStype(string s) {
    int c0 = 0, c1 = 0;
    for (int i = 0; i < s.size(); i++) if (s[i] == '1') c1++; else c0++;
    if (c1 == 0)return 'B';
    else if (c0 == 0) return 'I';
    return 'F';
}

/**
 * 功能:构建FBI树
 * @param start 开始的位置
 * @param end   结束的位置
 */
void dfs(string s) {
    if (s.length() > 1) {
        //左树
        dfs(s.substr(0, s.length() / 2));//从哪个位置开始,截取多少个
        //右树
        dfs(s.substr(s.length() / 2));//从哪个位置开始,不说截取多少个就是截取到尾
    }
    cout << getStype(s);//后序遍历
}


int main() {
    //这个n是无用的,因为是上古的考题,都是C时代的,要求使用char数组,没有n说不过去,现在都用string了,不需要n了。
    cin >> n >> s;
    //利用递归构建FBI树
    dfs(s);
    return 0;
}
posted @ 2021-08-05 09:31  糖豆爸爸  阅读(219)  评论(0编辑  收藏  举报
Live2D