1220: FBI树 [递归]

时间限制: 1 Sec 内存限制: 128 MB

提交: 5 解决: 4 状态

题目描述

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

1)T的根结点为R,其类型与串S的类型相同;

2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

输入

第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。

对于40%的数据,N <= 2;

对于全部的数据,N <= 10。

输出

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

样例输入

3
10001011

样例输出

IBFBBBFIBFIIIFF
因为为了练习二叉树才写的这道题,所以第一次是用建立二叉树的方法A的代码略长,后来发现可以递归自己写了个递归,,,最后看到了别人家的递归!!!下面:
巧妙地利用了返回值判断零一串!
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=(1<<10);
char s[maxn+20];
int write(int l,int r)
{
if(l==r)
{
printf("%c",(s[l]=='0')?'B':'I'); //是零表明是B串,输出B并返回0,1表明是I串输出I并返回1
return s[l]=='1';
}
int sl,sr,k=(l+r)/2;
sl=write(l,k),sr=write(k+1,r);
if(sl+sr==0){printf("B");return 0;} //如果左右两部分递归后返回值相加为零说明这是个零串,是二说明是‘1’串
if(sl+sr==2){printf("I");return 1;}
printf("F"); return 3; //否则就是01串
} int main()
{
while( scanf("%s%s",s,s)!=EOF)
write(0,strlen(s)-1),printf("\n");
return 0;
} 自己写的递归,因为加了判断01的部分略长

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[10005];
void dfs(int x,int y)
{
int t1=0,t2=0;
if(x==y) {printf("%c",(s[x]=='1'?'I':'B'));return;}
else{
int m=(x+y)/2;
dfs(x,m);
dfs(m+1,y);
for(int i=x;i<=y;++i) if(s[i]=='0') ++t1;
else if(s[i]=='1') ++t2;
if(t1&&t2) cout<<'F';
else if(t1&&!t2) cout<<'B';
else cout<<'I';
}
}
int main()
{
int n,m,i,j;
while(scanf("%s%s",s,s)!=EOF) dfs(0,strlen(s)-1),printf("\n");
return 0;
}

 

 

~递归递归(FBI树--蓝桥)的更多相关文章

  1. 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

    题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...

  2. 【递归+树】FBI树

    题目描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为BB串,全"1"串称为I串,既含"0& ...

  3. 蓝桥杯之FBI树问题

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  4. Java实现 蓝桥杯VIP 算法训练 FBI树

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  5. C#递归生成HTML树,C#递归生成xml树

    C#递归生成HTML树 public StringBuilder str = new StringBuilder();   //定义一个字符串 private void get_navigation_ ...

  6. 递归遍历JSON树

    递归遍历JSON树 前几天有个人问我,json串的层级无限深,但在json串中的key是已知的,在json串中的value,有些事Object,有些是Array,如何把这些层级无限深的key所对应的v ...

  7. JavaScript通过父节点ID递归生成JSON树

    JavaScript通过父节点ID递归生成JSON树: · 实现思路:通过递归实现(第一次递归的时候查询出所有的父节点,然后通过当前父节点id不断地去查询所有子节点,直到递归完毕返回)   · 代码示 ...

  8. Vijos 1114 FBI树

    描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...

  9. noip普及组2004 FBI树

    FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...

随机推荐

  1. HTTP从入门到入土(5)——HTTP报文格式

    HTTP报文格式 HTTP报文分为请求报文和响应报文,只有发送了请求报文,才会有响应报文. 常见的报文格式如下所示:

  2. 一起来全面解析5G网络领域最关键的十大技术

    提到5G,很多人的第一印象就是它的网络速度快.延时性低.带宽大,没错,这就是5G时代的特点!5G作为第五代移动通信网络,其峰值理论传输速度可达每秒数十Gb,这比4G网络的传输速度快数百倍,整部超高画质 ...

  3. troubleshooting-Kerberos 鉴权异常

    ERROR transport.TSaslTransport: SASL negotiation failurejavax.security.sasl.SaslException: GSS initi ...

  4. "1130-host ... is not allowed to connect to this MySql server"登录失败

    原因: 该用户没有远程连接权限. 解决:授权! mysql>GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' ...

  5. CentOS7.3防火墙firewalld简单配置

    今天安装了centos7.3, 想用iptables的save功能保存规则的时候发现跟rhel不一样了,  后来度娘说centos用的是firewalld而不是iptables了, 平时工作都是用re ...

  6. 20165310java_blog_week6

    2165310 <Java程序设计>第6周学习总结 教材学习内容总结 String 构造 String str=new String() String (char a[]) String ...

  7. UVa 714 Copying Books - 二分答案

    求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...

  8. USACO 1.3 Wormholes - 搜索

    Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...

  9. 安装VS提示系统找不到指定路径

    解决办法:删除C:\ProgramData\Package Cache快捷方式

  10. 面向对象之(非)绑定方法,反射,isinstance与issubclass

    isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查obj是否是类 cls 的对象 class Foo(object): pa ...