分析我们可以把由 0 和 1 组成的字符串分为三类:全 0 串称为 B 串,全 1 串称为 I 串,既含 0 又含 1 的串则称为 F串。
FBI树是一种二叉树,它的结点类型也包括 F 结点,B 结点和 I 结点三种。
由一个长度为 2N的 01 串 S 可以构造出一棵 FBI 树 T,递归的构造方法如下: T的根结点为 R,其类型与串 S的类型相同;
若串 S的长度大于 1,将串 S 从中间分开,分为等长的左右子串 S1 和 S2;由左子串 S1 构造 R 的左子树 T1,由右子串 S2 构造 R 的右子树 T2
。现在给定一个长度为 2N的 01 串,请用上述构造方法构造出一棵 FBI
树,并输出它的后序遍历序列。
输入格式
第一行是一个整数 N。
第二行是一个长度为 2N的 01串。
输出格式
包含一行,这一行只包含一个字符串,即 FBI树的后序遍历序列。
数据范围
0≤N≤10
输入样例:
3
10001011
输出样例:
IBFBBBFIBFIIIFF
代码实现递归算法
树的后序遍历
#include#include #include #include using namespace std; // FBI TREE int n; string fbi; int len; char gettype(string & s) { int len = s.size(); int len1 = len; string str ; while(len --) str += '0'; if(s == str) return 'B'; str.clear(); while(len1 -- ) str += '1'; if(s == str) return 'I'; else return 'F'; } void backorder(string & fbi, int len)//dfs { if(len > 1) { string leftstr = fbi.substr(0,len >> 1); backorder(leftstr, len >> 1); } if(len > 1){ string rightstr = fbi.substr(len / 2 ,len >> 1); backorder(rightstr, len >> 1); } printf("%c",gettype(fbi)); } int main() { scanf("%d",&n); cin >> fbi; len = 1 << n;//length backorder(fbi, len); cout << 'n'; return 0; }



