[2004年NOIP普及组] FBI树
[2004年NOIP普及组] FBI树
- 分析:根据题意,根据01字符构建树,然后根据01字符所代表的字母后序遍历输出,首先是在长度只有1时看所对应的字母是哪个,然后就是长度不为1时,使用截取字符函数(substr)分别截取前半部分和后半部分,然后进行递归,最后是跟据题意输出(只是将原本的数字换成了有意义的字母)
- 根据样例建树

-
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dfs(string s)
{
int len=s.length();//求长度
if(len==1)//当只有一个字母时
{
if(s[0]=='0')
{
cout<<"B";
return 0;
}
if(s[0]=='1')
{
cout<<"I";
return 1;
}
}
//后序遍历 递归
int x=dfs(s.substr(0,len/2));//从0开始 截取len/2个为左子树
int y=dfs(s.substr(len/2,len/2));//从len/2开始 截取len/2个为右子树
if(x==2||y==2||x!=y)//两者都有
{
cout<<"F";
return 2;
}
else if(x==0&&y==0)
{
cout<<"B";
return 0;
}
else if(x==1&&y==1)
{
cout<<"I";
return 1;
}
}
int main()
{
string s;
int n;
cin>>n;
cin>>s;
dfs(s);//调用
return 0;
}

浙公网安备 33010602011771号