ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)
问题描述
我们可以把由“”和“”组成的字符串分为三类:全“”串称为B串,全“”串称为I串,既含“”又含“”的串则称为F串。
FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“”串S可以构造出一棵FBI树T,递归的构造方法如下:
)T的根结点为R,其类型与串S的类型相同;
)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。
输入格式
第一行是一个整数N( <= N <= ),第二行是一个长度为2N的“”串。
输出格式
包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入 样例输出
IBFBBBFIBFIIIFF
数据规模和约定
对于40%的数据,N <= ;
对于全部的数据,N <= 。
注:
[] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。
记:
一开始解题根据惯用FBI树解法:建树->递归判断数据并记录->后序输出树

这种解法在输入n较大时会出现超时现象,
明显在建树以及后序输出遍历输出树的过程浪费了很多时间;
本题中的数据采用二叉树存储,而且是后序遍历输出树,
所以我们可以采用类似二分查找的形式,
先对输入数据进行二分区,然后进行判断
输出判断后的字符('F','B','I'),并返回
从而节省了建树以后序遍历输出树的时间。
AC代码:
#include <stdio.h>
#define MAX (1<<10) int n = ;
char str[MAX+] = {}; void init()
{
int i,j;
scanf("%d",&n);
for (i = ; i <= (<<n) ; i ++)
{
scanf("%1d",&j);
/*将输入的数字串转换为FBI串*/
if (j)
{
str[i] = 'I';
}
else
{
str[i] = 'B';
}
}
return ;
} char check(char l,char r)
{
if (l == 'B' && r == 'B')
{
return 'B';
}
else if (l == 'I' && r == 'I')
{
return 'I';
}
else
{
return 'F';
}
} char fbi(int x,int y)
{
int i = x , j = y , k = (y-x)/;
char l,r,ans = str[i];
if (i < j)
{
/*递归分区间*/
l = fbi(i,i+k);/*左子树*/
r = fbi(j-k,j);/*右子树*/
ans = check(l,r);
}
printf("%c",ans);
return ans;
} int main(void)
{
init();
fbi(,<<n);
return ;
}
ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)的更多相关文章
- ALGO-143_蓝桥杯_算法训练_字符串变换
问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,,,,5这5个参数分别指代不同的5种字符串操作, ...
- ALGO-6_蓝桥杯_算法训练_安慰奶牛
记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include ...
- ALGO-5_蓝桥杯_算法训练_最短路
记: 一开始没接触过关于最短距离的算法,便开始翻阅关于图的知识, 得知关于最短距离的算法有Dijkstra算法(堆优化暂未看懂),Bellman-Ford算法,Floyd算法,SPFA算法. 由于数据 ...
- 蓝桥杯_算法训练_ALGO10_集合运算
这个题实际上思路是比较简单的,但是需要注意细节问题. 思路:读入数组之后进行排序,然后再求交.并.补集. 首先排序:(使用的是冒泡排序) #include<iostream> using ...
- 蓝桥杯_算法训练_Torry的困惑(基本型)
这个题目就是求质数的乘积,在加一个模,思路比较简单,直接上代码: #include<iostream> using namespace std; bool isPrime(int a) { ...
- 蓝桥杯_算法训练_区间k大数查询
问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...
- ALGO-43_蓝桥杯_算法训练_A+B Problem
问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 输出一个整数,表示A+B的值. 样例输入 样例输出 数据规模和约定 -,,,<=A,B< ...
- ALGO-39_蓝桥杯_算法训练_数组排序去重
问题描述 输入10个整数组成的序列,要求对其进行升序排序,并去掉重复元素. 输入格式 10个整数. 输出格式 多行输出,每行一个元素. 样例输入 样例输出 解题思路: 若输入的数字存在数组中,剔除,否 ...
- ALGO-115_蓝桥杯_算法训练_和为T(枚举)
问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...
随机推荐
- 前端解析websocket数据问题
buf []byte //err = websocket.Message.Send(ws, buf) err = websocket.Message.Send(ws, string(buf[:])) ...
- ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- 字符串转json格式
方法一:var json = JSON.parse(str)方法二:eval
- nginx负载均衡、nginx ssl原理及生成密钥对、nginx配制ssl
1.nginx负载均衡 新建一个文件:vim /usr/local/nginx/conf/vhost/load.conf写入: upstream abc_com{ip_hash;server 61.1 ...
- django cookie与session组件
本文目录 1 会话跟踪技术 2 cookie介绍 Django中操作Cookie Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 回到目录 ...
- 《DSP using MATLAB》Problem 6.11
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 怎样去掉wordpress中默认的未分类目录
默认的是不能删除的,要删除未分类,需要将默认的分类目录设置为其他 具体设置方法为:后台-设置-撰写,将撰写设置下面的默认链接分类目录设置为其他的,点击下面的保存更改,然后就可以删除默认的未分类目录了.
- wekpack笔记
1. webpack 是一个用来构建我们应用程序中的 JavaScript 模块的工具: 2. 可以从CLI 或 API来开始使用 webpack.这里只讲从CLI来使用它: 3. 安装,需要在nod ...
- Gravitee.io Access Management 组件
Access Management组件在Gravitee.io 主要是进行认证以及权鉴的处理,支持oauth2 以及openid connect 等协议,同时好多功能已经集成在ui 管理界面上了,还是 ...
- kustomize 模版自由的配置&&自定义kubernetes工具
kustomize 是一个可以方便我们基于模版配置,自定义kubernetes 的工具,类似kompose,但是个人觉得kompose 更灵活点,而且使用上更方便 安装 mac brew instal ...