NOIP2004FBI树
题目描述
我们可以把由“00”和“11”组成的字符串分为三类:全“00”串称为BB串,全“11”串称为I串,既含“00”又含“11”的串则称为F串。
FBIFBI树是一种二叉树,它的结点类型也包括FF结点,BB结点和I结点三种。由一个长度为2^N2
N
的“0101”串S可以构造出一棵FBIFBI树TT,递归的构造方法如下:
TT的根结点为RR,其类型与串SS的类型相同;
若串SS的长度大于11,将串SS从中间分开,分为等长的左右子串S_1S
1
和S_2S
2
;由左子串S_1S
1
构造R的左子树T_1T
1
,由右子串S_2S
2
构造RR的右子树T_2T
2
。
现在给定一个长度为2^N2
N
的“0101”串,请用上述构造方法构造出一棵FBIFBI树,并输出它的后序遍历序列。
输入格式
第一行是一个整数N(0 \le N \le 10)N(0≤N≤10),
第二行是一个长度为2^N2
N
的“0101”串。
输出格式
一个字符串,即FBIFBI树的后序遍历序列。
输入输出样例
输入 #1
3
10001011
输出 #1
IBFBBBFIBFIIIFF
说明/提示
对于40%的数据,N \le 2N≤2;
对于全部的数据,N \le 10N≤10。
noip2004普及组第3题
这题就是考察二叉树的基本知识
思路如下:
1.递归运算
2.若可再分,就左子树递归,右子树递归
3.然后进行自身的计算即可
如果不会二叉树的话,上网搜一搜看一看就可以了
有关题解:
【模板】二叉树
【模板】求先序排列
其余不懂的见注释
C++ Code:
#include <iostream>
#include <cmath>
using namespace std;
string s;
void FBI(int left,int right)//递归
{
int mid=(left+right)/2;//进行二分
if(left<right)
{
FBI(left,mid);
FBI(mid+1,right);
} //切分成左子树与右子树
int zero=0,one=0;
for(int i=left;i<=right;i++)
{
if(s[i]=='0')
zero++;
else
one++;
}//判断有几个0,几个1
if(zero==0 and one>=1)
cout<<"I";//为I树
if(zero>=1 and one==0)
cout<<"B";//为B树
if(zero>=1 and one>=1)
cout<<"F";//为F树
}
int main()
{
int n,z;
cin>>n;
z=pow(2,n)-1;//求出一共有多少个点 2^n-1
cin>>s;//输入01串
FBI(0,z);
return 0;
}