信息学奥赛一本通 1365:FBI树(fbi) | 1928:【04NOIP普及组】FBI树 | 洛谷 P1087 [NOIP2004 普及组] FBI 树
【题目链接】
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 树相关推荐
- 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
[题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...
- 信息学奥赛一本通 1279:【例9.23】橱窗布置(flower) | 洛谷 P1854 花店橱窗布置
[题目链接] ybt 1279:[例9.23]橱窗布置(flower) 洛谷 P1854 花店橱窗布置 吐槽:一本通中给的测试数据中,负号是全角负号!怪不得每次数据读不完程序就结束了.还是用洛谷的测试 ...
- 信息学奥赛一本通 1319:【例6.1】排队接水 | 洛谷 P1223 排队接水
[题目链接] ybt 1319:[例6.1]排队接水 洛谷 P1223 排队接水 [题目考点] 1. 贪心 2. 贪心选择性质的证明 要想证明贪心选择可以得到最优解,只需要证明最优解包含每一次的贪心选 ...
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1107:校门外的树
时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11290 通过数: 6162 [题目描述] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路 ...
- 信息学奥赛一本通 1314:【例3.6】过河卒(Noip2002) | 1921:【02NOIP普及组】过河卒 | 洛谷 P1002 [NOIP2002 普及组] 过河卒
[题目链接] ybt 1314:[例3.6]过河卒(Noip2002) ybt 1921:[02NOIP普及组]过河卒 洛谷 P1002 [NOIP2002 普及组] 过河卒 [题目考点] 1. 坐标 ...
- 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环
[题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...
- 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列
[题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...
- 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题
[题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...
- 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩
[题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...
最新文章
- OpenCV 【三】————contours便利删除操作方法
- 战略设计,必须首先把握产业的脉搏
- 2010年5月八达岭野生公园 51CTO老虎围观团强力插入
- Laravel 5.0 的新特性
- KMP字符串模式匹配详解
- 广告深度学习计算:异构硬件加速实践
- python解析html xml最好的模块_python中处理xml的模块哪个好?
- 每天工作6小时,月入过万,这个新职业火了
- 全球最顶级的电脑配置_全球最顶级外汇交易员,非这10位莫属
- 多线程设计模式(二):Future模式
- SSH框架+mysql+tomcat 服务器 中文乱码解决方案
- 【分享】具有“魔性”的通用软件开发框架
- matlab 工具函数 —— normalize(归一化数据)
- vs2010编译curl为static库及测试
- 24个能给你的博客带来流量的网站
- 计算机折线图教程,excel怎么插入折线图 excel怎么将多个折线图合并
- (Java蓝桥杯算法)递归方法求Ckn
- “U盘写保护”什么解除
- Java 生成随机长度字母组合
- 春季三月各行业活动营销指南
热门文章
- c语言中怎么转换类型数据类型,C语言中数据类型转换
- 见证2008,盘点2008
- python设置随机数种子(numpy,pytorch,random)
- 支持向量机回归和支持向量机_详细解释支持向量机
- YUV 格式详解-史上最全
- (四十七)论文阅读 | 轻量级网络之MobileNetV3
- 节假日读取接口_判断日期是否为法定节假日的API接口与示例函数
- 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货
- minhash算法检索相似文本_文本相似度算法之-minhash
- 这几年为什么Python在中国突然就火了起来了?