NOIP2004FBI树

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;
}
发布了17 篇原创文章 · 获赞 16 · 访问量 307

猜你喜欢

转载自blog.csdn.net/user_qym/article/details/104081318