蓝桥杯 算法训练 FBI树
2016-12-23 18:57
183 查看
FBI树
问题描述我们可以把由“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”串。
输出格式
包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
数据规模和约定
对于40%的数据,N <= 2;
对于全部的数据,N <= 10。
注:
[1] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[2] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。
题解:
这题算是树的入门题,用来熟悉一下建树和遍历树的过程。要注意细节,建树的时候左右子树如果为空要置为NULL,否则会出错。代码:
#include <iostream> #include <string> #include <cmath> #define MAXSIZE 10000 using namespace std; int num[MAXSIZE]; struct Node { char c; Node *left, *right; }; string s; void StrToNumArray(string s, int *num, int len); //字符串转换为int数组 char fbi(int *num, int begin, int end); // 判断FBI类型 Node *build(int *num, int begin, int end); // 建树 void PostOrderTraverse(Node *h); // 后序遍历 int main() { int n; // 读入字符串,转换为int数组,然后建树,然后后续遍历。 cin >> n >> s; int m = pow(2, n); StrToNumArray(s, num, m); Node *head = build(num, 0, m-1); PostOrderTraverse(head); cout << endl; return 0; } void StrToNumArray(string s, int *num, int len) { for(int i = 0; i < len; i++) { num[i] = s[i] - '0'; } } char fbi(int *num, int begin, int end) { int sum = 0; for(int i = begin; i <= end; i++) { sum += num[i]; } if (!sum) return 'B'; else if (sum == end - begin + 1) return 'I'; else return 'F'; } Node *build(int *num, int begin, int end) { char c = fbi(num, begin, end); Node *p = new Node; p->c = c; if(begin < end) { // 子树不为空,继续建树 int mid = (begin + end) / 2; p->left = build(num, begin, mid); p->right = build(num, mid+1, end); } else { // 子树为空要置为NULL p->left = p->right = NULL; } return p; } void PostOrderTraverse(Node *h) { if(h->left) PostOrderTraverse(h->left); if(h->right) PostOrderTraverse(h->right); cout << h->c; }
相关文章推荐
- 蓝桥杯 算法训练 K好数
- 蓝桥杯算法训练 删除数组零元素
- 蓝桥杯-算法训练 大小写转换
- 蓝桥杯 算法训练 字符串的展开
- 蓝桥杯ALGO-152—— 算法训练 求完数
- 蓝桥杯-算法训练-ALGO-87 字串统计 Java实现
- 蓝桥杯 算法训练 安慰奶牛
- 蓝桥杯 算法训练 排序
- 蓝桥杯 算法训练 4-1打印下述图形
- 蓝桥杯 算法训练 传纸条
- 蓝桥杯 算法训练 sine 之舞
- 蓝桥杯 算法训练 6-1 递归求二项式系数值
- 蓝桥杯 - 算法训练 最大最小公倍数 C语言实现
- 蓝桥杯 ALGO-120 算法训练 学做菜
- 蓝桥杯 ALGO-102 算法训练 数对
- Java-蓝桥杯- 算法训练 排序
- 蓝桥杯算法训练之杨辉三角
- 16蓝桥杯算法训练—安慰奶牛
- 蓝桥杯 算法训练 最大最小公倍数
- 蓝桥杯【算法训练】大小写转换