搜索练习题——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树,并输出它的后序遍历序列。
·知识拓展:
关于遍历的顺序:
(1)先序遍历:
如图,这是一个二叉树,A为根结点。这张图如果用先序遍历表示的话,应为ABDEGHJCFIKL。总的来说,先序遍历的遍历方式为先根后左再右,简记为:根左右
(2)中序遍历:
如图,还是这个二叉树,但是这张图如果用中序遍历表示的话,应为DBGEJHAFIKLC。不难看出,后序遍历的遍历方式为先左后根再右,简记为:左根右
(3)后序遍历:
又是这张图,还是这个二叉树,用后序遍历表示这张图的话,应为DGJHEBKLIFCA。与上面的两种遍历方式相比较,可知,后序遍历的遍历方式为先左后右再根,简记为:左右根
·题目分析:
刚拿到这道题时,我没有仔细读题,只是将样例中的字符串写成了树,然后又按照后序遍历将这个字符串重新排列,将排列之后的字符串两个一组判断是F、B或I,但是这明显是错的。
本题的意思是将字符串写成树后,对每一个结点先进行判断F、B或I,然后按照后序遍历输出,没有对字符串长度的限制,不能两个一组进行判断
·思路分析:
对于这道题,我们可以采用边建树边输出的方法,结合深搜(其实就是一个大大的暴力),就可以得到这个题目的大致思路:
我们可以设一个dfs(l,r)函数,这个函数表示从l到r的字符串建树(并且输出F、B、I)
如果r-l>1,就将这个函数变为dfs(l,mid)和dfs(mid+1,r),其中mid为l和r的中点,就是(l+r)/2
如果r-l=1,这个函数就递归到了尽头,则需要按照后序遍历的方式将F、B、I输出
·代码实现:
好了,talk is cheap,show me the code
#include<iostream>
#include<string>
using namespace std;
int n;
string s;
void dfs(int l,int r){
if(l==r){
if(s[l]=='')cout<<'B';
if(s[l]=='')cout<<'I';
return ;
}
int mid=(l+r)/;
dfs(l,mid);
dfs(mid+,r);//后序遍历
bool B=true;//全是0
bool I=true;//全是1
for(int i=l;i<=r;i++){
if(s[i]=='')B=false;//有1
if(s[i]=='')I=false;//有0
}
if(B)cout<<'B';
else if(I)cout<<'I';
else cout<<'F';
}
int main(){
cin>>n>>s;//用cin会好一点TwT
dfs(,(<<n)-);//0~2^n-1
}
·总结:
这道题属于典型的“挂羊头卖狗肉”问题,题目名称和题目中的各个方面都是跟树相关,但是这个题目的解决方法却与树并没有太大的关系(虽然也用到了树的知识)。虽然自己图论学的不够好,但也不能因为题目中的暗示放弃了解题的机会啊!
搜索练习题——FBI树的更多相关文章
- Vijos 1114 FBI树
描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&quo ...
- 【递归】Vijos P1114 FBI树(NOIP2004普及组第三题)
题目链接: https://vijos.org/p/1114 题目大意: 把01串一分为二,左半边描述当前节点左子树,右半边描述右子树,子树全为1则为I节点,全为0则为B节点,混合则为F节点,直到当前 ...
- 创建FBI树
需求:数串由2^n个'0' '1'数串组成,对于一个数串,有01混合出现,则视为F,全0数串为B,全1数串为I. 将给定数串进行切割,如10010011可以用二叉树表示为 F(10010011) / ...
- 蓝桥杯之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树是一种二叉树,它 ...
- FBI树-数据结构(二叉树)
问题 B: [2004_p4]FBI树-数据结构 时间限制: 1 Sec 内存限制: 125 MB提交: 57 解决: 46 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称 ...
- C语言 · FBI树
算法训练 FBI树 时间限制:1.0s 内存限制:256.0MB 锦囊1 二叉树. 问题描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I ...
随机推荐
- python:count 函数
API 一.string 中 某字符 的次数 str.count(sub, start= 0,end=len(string)) Args Annotations sub 搜索的子字符串 start 字 ...
- MySql 5.7关键字和保留字-附表
现在使用navicat图形界面或者Hibernate做映射生成表的时候,渐渐的会忽视掉关键字这个问题,而后续也会不断的产生错误提示,一遍遍的查询代码无果,甚至开始怀疑人生,但是其实很多情况下只是使用了 ...
- openstack docker build error
1. _proto_tcp = socket.getprotobyname('tcp') OSError: protocol not found you should have a /etc/prot ...
- 单元测试 - tox 使用
1. 问题一 $ tox -e pep8 -- testdemo.server pep8 installed: alembic==,amqp==,appdirs==,Babel==,beautiful ...
- 可以提升幸福感的js小技巧(上)
1. 类型强制转换 1.1 string强制转换为数字 可以用 *1来转化为数字(实际上是调用 .valueOf方法) 然后使用 Number.isNaN来判断是否为 NaN,或者使用 a!==a 来 ...
- css实现两个div并排等高(一个div高度随另一个高度变化而变化)
方法一.两个div都设置 display: table-cell; 方法二.父级div设置 display: -webkit-box;
- C# Entity Framework 更新数据的三种方法
例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...
- jenkins项目名称改后,同步nginx配置
jenkins项目名称修改后,workspace的名称会同步更改,构建完了和原来的不是一个路径,如果每个前端项目一个单独的tomcat的话,需要更改nginx配置 /etc/nginx/conf.d
- python 字符串方法及列表,元组,字典(一)
字符串 str 注: 若想要保持单引号和双引号为字符串的一部分 1)单双引号交替使用, 2)使用转义字符\ 3)成对三个引号被存在变量里 二.字符串详细用法 字符串的单个取值例 p_1=”hello” ...
- 跨平台开发框架DevExtreme v19.1.4正式发布|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...


