NC16660 [NOIP2004]FBI树
题目
题目描述
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树[1],它的结点类型也包括F结点,B结点和I结点三种。由一个长度为 的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1) T的根结点为R,其类型与串S的类型相同;
2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历[2]序列。
[1] 二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[2] 后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。
输入描述
第一行是一个整数
第二行是一个长度为 的“01”串。
输出描述
一个字符串,即FBI树的后序遍历序列。
示例1
输入
3 10001011
输出
IBFBBBFIBFIIIFF
备注
对于 的数据,;
对于全部的数据,。
题解
知识点:树,分治。
按照要求递归,因为输出后序,所以输出放在两个递归之后。如果每次都完整遍历判断一次,时间复杂度是 ,但发现串的类型和两个子串类型是有必然关系的,因此每次返回串类型就能减小复杂度至 。
递归:长度为 判断类型后输出并返回,其余长度考虑左子树右子树的情况,发现相同类型子树合并后还是同样的类型,而不同类型子树合并必然是 型,随后输出并返回。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; string s; char lo(int l, int r) { if (l == r) { if (s[l] == '0') { cout << 'B';return 'B'; } else { cout << 'I';return 'I'; } } char lc = lo(l, l + r >> 1); char rc = lo((l + r >> 1) + 1, r); if (lc == rc) { cout << lc;return lc; } else { cout << 'F';return 'F'; } } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; cin >> s; lo(0, (1 << n) - 1); cout << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16404477.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧