创建FBI树
需求:数串由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树的更多相关文章
- C语言 · FBI树
算法训练 FBI树 时间限制:1.0s 内存限制:256.0MB 锦囊1 二叉树. 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I ...
- Vijos 1114 FBI树
描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...
- 表达式:使用API创建表达式树(3)
一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...
- 表达式:使用API创建表达式树(2)
一.BlockExpression类:表式一个包含可在其中定义变量的表达式序列的块.是一组表达式,类似于多个委托的 += 后的效果,其返回表达式是最后一个表达式决定.以下是BlockExpressio ...
- 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)
题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...
- 蓝桥杯之FBI树问题
问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...
- noip普及组2004 FBI树
FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...
- Vijos P1114 FBI树【DFS模拟,二叉树入门】
描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种 ...
- [题解]ybt1365:FBI树(fbi)
ybt1365:FBI树(fbi) [题目描述] 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树,它 ...
随机推荐
- IIC的标准操作函数集(C51)包含C和H文件
/********************************************************************* 头文件名 VIIC_C51.H 这个头文件对应的库是VII ...
- jQuery的入门与简介《思维导图》
<初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我知道了jQuery拥有强大的选择器, 出色的DOM操作 ...
- 【转】如何查看linux版本 如何查看LINUX是多少位
原文网址:http://sopace.blog.51cto.com/1227753/670526 如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! 1. 查看内核版本命令: ...
- UESTC_树上战争 CDOJ 32
给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜. Input 输入包含多组数据 每组第 ...
- OpenRisc-45-or1200的ID模块分析
引言 之前,我们分析了or1200流水线的整体结构,也分析了流水线中IF级,EX级,本小节我们来分析ID(insn decode)级的一些细节. 1,基础 or1200的pipeline的ID阶段包含 ...
- bash及其特性(笔记)
bash及其特性:shell: 外壳GUI:Gnome, KDE, XfceCLI: sh, csh, ksh, bash, tcsh, zsh root, student程序:进程 进程:在每个进程 ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- Beauty of Array(模拟)
M - M Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Status P ...
- JavaScript 运行机制详解:深入理解Event Loop
Philip Roberts的演讲<Help, I'm stuck in an event-loop>,详细.完整.正确地描述JavaScript引擎的内部运行机制. 一.为什么JavaS ...
- 删除一个表中的重复数据同时保留第一次插入那一条以及sql优化
业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据. 目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响. 解题过程: 第一步:查出 ...