【题目链接】

ybt 1365:FBI树(fbi)
ybt 1928:【04NOIP普及组】FBI树
洛谷 P1087 [NOIP2004 普及组] FBI 树

【题目考点】

1. 二叉树

【解题思路】

设树中结点类型,包含char类型的val成员变量,意为结点的类型,可以是’F’, ‘B’或’I’。
估算该问题可能用到的最大结点数。易知FBI树是满二叉树,FBI串最长有 2 N 2^N 2N,N最大是10,也就是说这个树的叶子结点最多有 2 10 2^{10} 210 个,整棵树的结点数为 2 0 + 2 1 + . . . + 2 10 = 1 ( 1 − 2 11 ) 1 − 2 = 2 11 − 1 = 2047 2^0+2^1+...+2^{10}=\frac{1(1-2^{11})}{1-2}=2^{11}-1=2047 20+21+...+210=1−21(1−211)​=211−1=2047,数组长度设为2050刚刚好。
设函数createTree,参数为fs。意为:根据FBI串fs来构建一棵二叉树。
FBI串的长度都是2的整数幂,下表从0开始,长度为fs.length()。那么fs.length()/2为中间偏右的位置。左半边下标范围为0~fs.length()/2-1,右半边下标范围为fs.length()/2~fs.length()-1。取子串得到左右子树的FBI串,递归调用本函数根据FBI串生成左右子树。

  • 若左右子树根结点的类型相同,那么这棵树根结点也是这个类型(左右子树根结点的类型如果都是I,那么根结点类型也为’I’;若都是’B’, 根结点类型为’B’)。
  • 若左右子树根结点的类型不同,那么这棵树根结点的类型为’F’。

递归出口为:如果FBI串fs长度为1,那么这个结点是叶子结点。看这个字符串中的唯一的字符来确定这个结点的val。

  • 如果是’1’,那么这个叶子结点的val为’I’。
  • 如果是’0’, 那么这个叶子结点的val为’B’。

得到树后,对这棵树做后序遍历。

【题解代码】

解法1:使用string类

#include <bits/stdc++.h>
using namespace std;
#define N 2050
struct Node
{char val;//结点类型,可以是'F', 'B', 或'I' int left, right;
};
Node node[N];//结点池
int n, p;
string s;
int createTree(string fs)//根据FBI串fs构建二叉树,返回二叉树的根
{int np = ++p;if(fs.length() == 1){node[np].val = fs[0] == '1' ? 'I' : 'B';return np; }string ls = fs.substr(0, fs.length()/2), rs = fs.substr(fs.length()/2);int lp = createTree(ls), rp = createTree(rs);node[np].left = lp, node[np].right = rp;if(node[lp].val == node[rp].val)node[np].val = node[lp].val;//如果二者相同,那么父节点 elsenode[np].val = 'F';return np;
}
void postOrder(int r)
{if(r == 0)return;postOrder(node[r].left);postOrder(node[r].right);cout << node[r].val;
}
int main()
{cin >> n >> s;int root = createTree(s);postOrder(root);return 0;
}

解法2:使用字符数组

#include <bits/stdc++.h>
using namespace std;
#define N 2050
struct Node
{char val;int left, right;
};
Node node[N];
int p;
char s[N];
int createTree(int l, int r)//通过s[l]~s[r]的字符串建立FBI树,返回树根结点的地址
{int np = ++p;if(l == r){if(s[l] == '0')node[np].val = 'B';elsenode[np].val = 'I';return np;}int lp = createTree(l, (l+r)/2), rp = createTree((l+r+1)/2, r);//(l+r+1)/2是中间偏右位置 node[np].left = lp, node[np].right = rp; if(node[lp].val == node[rp].val)node[np].val = node[lp].val;elsenode[np].val = 'F';return np;
}
void postOrder(int r)
{if(r == 0)return;postOrder(node[r].left);postOrder(node[r].right);cout<<node[r].val;
}
int main()
{int n, n1;cin >> n1;n = (int)pow(2,n1);//n:字符串总长度 cin >> s;int root = createTree(0, n-1);postOrder(root);return 0;
}

信息学奥赛一本通 1365:FBI树(fbi) | 1928:【04NOIP普及组】FBI树 | 洛谷 P1087 [NOIP2004 普及组] FBI 树相关推荐

  1. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  2. 信息学奥赛一本通 1279:【例9.23】橱窗布置(flower) | 洛谷 P1854 花店橱窗布置

    [题目链接] ybt 1279:[例9.23]橱窗布置(flower) 洛谷 P1854 花店橱窗布置 吐槽:一本通中给的测试数据中,负号是全角负号!怪不得每次数据读不完程序就结束了.还是用洛谷的测试 ...

  3. 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水

    [题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...

  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1107:校门外的树

    时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11290 通过数: 6162 [题目描述] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路 ...

  5. 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒

    [题目链接] ybt 1314:[例3.6]过河卒(Noip2002) ybt 1921:[02NOIP普及组]过河卒 洛谷 P1002 [NOIP2002 普及组] 过河卒 [题目考点] 1. 坐标 ...

  6. 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

    [题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...

  7. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  8. 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题

    [题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...

  9. 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩

    [题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...

最新文章

  1. OpenCV 【三】————contours便利删除操作方法
  2. 战略设计,必须首先把握产业的脉搏
  3. 2010年5月八达岭野生公园 51CTO老虎围观团强力插入
  4. Laravel 5.0 的新特性
  5. KMP字符串模式匹配详解
  6. 广告深度学习计算:异构硬件加速实践
  7. python解析html xml最好的模块_python中处理xml的模块哪个好?
  8. 每天工作6小时,月入过万,这个新职业火了
  9. 全球最顶级的电脑配置_全球最顶级外汇交易员,非这10位莫属
  10. 多线程设计模式(二):Future模式
  11. SSH框架+mysql+tomcat 服务器 中文乱码解决方案
  12. 【分享】具有“魔性”的通用软件开发框架
  13. matlab 工具函数 —— normalize(归一化数据)
  14. vs2010编译curl为static库及测试
  15. 24个能给你的博客带来流量的网站
  16. 计算机折线图教程,excel怎么插入折线图 excel怎么将多个折线图合并
  17. (Java蓝桥杯算法)递归方法求Ckn
  18. “U盘写保护”什么解除
  19. Java 生成随机长度字母组合
  20. 春季三月各行业活动营销指南

热门文章

  1. c语言中怎么转换类型数据类型,C语言中数据类型转换
  2. 见证2008,盘点2008
  3. python设置随机数种子(numpy,pytorch,random)
  4. 支持向量机回归和支持向量机_详细解释支持向量机
  5. YUV 格式详解-史上最全
  6. (四十七)论文阅读 | 轻量级网络之MobileNetV3
  7. 节假日读取接口_判断日期是否为法定节假日的API接口与示例函数
  8. 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货
  9. minhash算法检索相似文本_文本相似度算法之-minhash
  10. 这几年为什么Python在中国突然就火了起来了?