需求:数串由2^n个'0' '1'数串组成,对于一个数串,有01混合出现,则视为F,全0数串为B,全1数串为I。

将给定数串进行切割,如10010011可以用二叉树表示为

F(10010011)

/                            \

F (1001)                   F(0011)

/               \                   /            \

F(10)         F(01)        B(00)      I(11)

/     \           /    \            /    \         /    \

I(1)B(0)  B(0) I(1)     B(0)B(0) I(1)I(1)

思路:由上述可以看出,FBI树是一棵满二叉树,可以使用逆向建树方法,以逐层建树的方法,先建立叶子节点层,然后生成其上层节点,如此类推,可以快速得到二叉树。

而且我们可以看到孩子的值与双亲的值的关系如下:

左/右孩子值      左/右孩子值      双亲值

F             +           F           =        F

F             +           B           =        F

F             +           I             =        F

I             +           B             =        F

B            +           B           =        B

I             +           I              =         I

由此确定双亲的值。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> struct tree_node;
struct tree_node{
struct tree_node *lc;
struct tree_node *rc;
char key;
};
typedef struct tree_node treenode; void create_fbitree(treenode **T, char *num){
int numlen, k;
int levelcnt;
treenode *nodetemp, *levelnode, *levelnodekids; numlen = strlen(num);
levelcnt = numlen;
levelnode = (treenode*)malloc(sizeof(treenode)*levelcnt);
for(k=0; k<levelcnt; k++){
(levelnode+k)->lc = NULL;
(levelnode+k)->rc = NULL;
if(num[k]=='1')
(levelnode+k)->key = 'I';
else
(levelnode+k)->key = 'B';
}
levelcnt = levelcnt/2;
levelnodekids = levelnode; while(levelcnt){
levelnode = (treenode*)malloc(sizeof(treenode)*levelcnt);
for(k=0; k<levelcnt; k++){
(levelnode+k)->lc = levelnodekids+k*2;
(levelnode+k)->rc = levelnodekids+k*2+1;
if((levelnodekids+k*2)->key=='B'&&(levelnodekids+k*2+1)->key=='B')
(levelnode+k)->key = 'B';
else if((levelnodekids+k*2)->key=='I'&&(levelnodekids+k*2+1)->key=='I')
(levelnode+k)->key = 'I';
else
(levelnode+k)->key = 'F';
}
levelcnt = levelcnt/2;
levelnodekids = levelnode;
}
*T = levelnode;
} void pre_visit_tree(treenode *T){
if(T!=NULL){
printf("%c ", T->key);
pre_visit_tree(T->lc);
pre_visit_tree(T->rc);
}
else{
return;
}
} int main(void){
treenode *T;
char num[1000]; if(gets(num)==NULL)
return 0;
create_fbitree(&T, num);
pre_visit_tree(T); system("pause");
return 0;
}

创建FBI树的更多相关文章

  1. C语言 · FBI树

    算法训练 FBI树   时间限制:1.0s   内存限制:256.0MB        锦囊1 二叉树. 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I ...

  2. Vijos 1114 FBI树

    描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...

  3. 表达式:使用API创建表达式树(3)

    一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...

  4. 表达式:使用API创建表达式树(2)

    一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...

  5. 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)

    题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...

  6. 蓝桥杯之FBI树问题

    问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...

  7. noip普及组2004 FBI树

    FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...

  8. Vijos P1114 FBI树【DFS模拟,二叉树入门】

    描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种 ...

  9. [题解]ybt1365:FBI树(fbi)

    ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...

随机推荐

  1. C# 委托2

    委托的定义: (1) 将方法作为变量使用的一种机制,就是将方法当作变量用(声明,赋值,传参)   (2) 将变量当作方法来用,首先就要去声明变量,就要考虑变量的类型,就是(委托变量,对应方法的返回值, ...

  2. Spring Task Scheduler - No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined

    1. Overview In this article, we are discussing the Springorg.springframework.beans.factory.NoSuchBea ...

  3. Luci流程分析(openwrt下)

    1. 页面请求: 1.1. 代码结构 在openwrt文件系统中,lua语言的代码不要编译,类似一种脚本语言被执行,还有一些uhttpd服务器的主目录,它们是: /www/index.html cgi ...

  4. uva 101 by sixleaves

    这是一道很好的模拟题,用vector<int> p[maxn],建立模型,映射为maxn个堆.主要要掌握vector模拟堆操作的简单方法.接下来得思路是自顶向下的方式,逐步完善程序.首先根 ...

  5. RIAidea – Focus on Flash/Flex/AIR » About Me

    RIAidea – Focus on Flash/Flex/AIR » About Me Browse > Home > About Me Tuesday, May 20, 2014 | ...

  6. 怎样使用LaTeX输入葡萄牙语等语言中的特殊字符

    论文中引用了大名鼎鼎ER random graph model,但是这两位的名字不太好打,发现Google Scholar中直接下载的bib文件中也是错的.找了一会,发现转义字符已经定义得很好了.只是 ...

  7. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  8. hdu 3478 Catch(染色 dfs 或 bfs )

    Problem Description A thief is running away! We can consider the city to N–. The tricky thief starts ...

  9. HDU 4735 Little Wish~ lyrical step~(DLX , 反复覆盖)

    解题思路: DLX 的模板题.反复覆盖. #include <stdio.h> #include <string.h> #include <iostream> #i ...

  10. Gridview 多重表头 (二)

    多重表头之排序 这是个有点忧桑的故事...Cynthia告诉我,研究一个问题,我们不可能有超过一天的时间... 结果好好几天过去鸟~~还没有完成... 由于不再使用Gridview自带的表头行,于是无 ...