首页 > Luogu P1087 FBI树

Luogu P1087 FBI树

 P1087 FBI树

题目描述

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

1) T的根结点为R,其类型与串S的类型相同;

2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

输入输出格式

输入格式:

 

第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2^N的“01”串。

 

输出格式:

 

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

 

输入输出样例

输入样例#1:

3
10001011
输出样例#1:

IBFBBBFIBFIIIFF

说明

对于40%的数据,N <= 2;

对于全部的数据,N <= 10。

noip2004普及组第3题

 

 1 #include 
 2 #include 
 3 
 4 struct node
 5 {
 6     char c;
 7     node *lc, *rc;    //左孩子右孩子
 8 };
 9 char a[1030];
10 
11 // node * 要传引用哦
12 void fbicreat(int lr, int rr, node *&p)
13 {
14     p = new node;
15     p->c = 'F';    //先设置成F 后面再判断
16 
17     //如果左右位置在一起,则表示此时的结点为叶
18     if(lr == rr)
19     {
20         if(a[lr] == '0')
21             p->c = 'B';
22         else if(a[lr]=='1')
23             p->c = 'I';
24         p->lc = p->rc = NULL;
25         return;
26     }
27     
28     //这里的判断参考了 keyword_ 的做法
29     bool b0, b1;    //标志b0是0是否出现
30     b0 = b1 = 0;    //标志b1是1是否出现
31     for(int i=lr; i<=rr; i++)
32     {
33         if(a[i]=='0') b0 = 1;
34         else if(a[i]=='1') b1 = 1;
35     }
36     if(b0 && !b1)    //相信大家都能看懂
37         p->c = 'B';
38     else if(b1 && !b0)
39         p->c = 'I';
40     
41     //二叉树二分咯
42     fbicreat(lr, (lr+rr)/2, p->lc);    
43     fbicreat((lr+rr)/2+1, rr, p->rc);
44 }
45 
46 
47 
48 void houxu(node *p)
49 {
50     if(p)    //如果是一棵真树
51     {        //后序遍历: 左 右 根
52         houxu(p->lc);
53         houxu(p->rc);
54         printf("%c", p->c);
55     }
56 }
57 
58 
59 int main()
60 {
61     int n;
62     scanf("%d
", &n);    //这里记得把回车给读取了
63     n = pow(2, n);
64     for(int i=0; i)
65         scanf("%c", a+i);
66     
67     node *p;
68     //从数组0位置到n-1位置建立FBI树
69     fbicreat(0, n-1, p);
70     houxu(p);
71     return 0;
72 }

 

转载于:https://www.cnblogs.com/yBaka/p/7366569.html

更多相关:

  • #include #include #include #include #include #include #include

  • 题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...

  • 加法伺候  //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...

  • 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程...

  • 简单record 一下 #include // 'struct sockaddr_in' #include #include // 'struct ifreq' and 'struct if_nameindex' #include #inc...

  • 二叉搜索树的编码和解码描述: 编码:即将一个二叉搜索树编码,节点数值转换为字符串 解码:即将一个字符串解码,数值转换为对应的二叉搜索树的节点 过程导图如下: 针对性编码实现如下: /*数字转字符串*/ void change_num_to_string(int val, string &tmp) {string buf;whil...

  • 二叉搜索树又名二叉排序树。 大概简略的思维导图如下,方便记忆特性 基本二叉搜索树创建过程如下 /*数据结构如下*/ typedef struct tree {int data;struct tree *left = NULL;struct tree *right = NULL; }Tree,*TreeNode;/*Node 为二...

  • Linux安装Nodejs       阿里云镜像: https://npm.taobao.org/mirrors/node/ 选择所需版本,进行下载。    我这边下载的是:https://npm.taobao.org/mirrors/node/v8.2.1/node-v8.2.1-linux-x64.tar.gz         ...

  • 1. HDFS Architecture 一种Master-Slave结构。包括Name Node, Secondary Name Node,Data Node Job Tracker, Task Tracker。JobTrackers: 控制全部的Task Trackers 。这两个Tracker将会在MapReduce课程里...

  • 下载Nodejs插件,下载zip压缩包后解压链接: http://pan.baidu.com/s/1hsBk60k 密码: jrcv打开Sublime Text3,点击菜单“首选项(N)” =>“浏览插件(B)”打开“Packages”文件夹,并将第1部的Nodejs文件夹剪切进来打开文件“Nodejs.sublime-build”,...