原题链接:蓝桥杯算法训练VIP-FBI树
https://www.dotcpp.com/oj/problem1592.html
思路
设当前串为S, 则画图模拟后有:
- 若S的字符和S.value == S.length; 节点Node=I
- 若S的字符和S.value == 0; 节点Node = B
- 此外Node = F
上述方法value不如改用统计0/1出现次数, 若能用正则表达式会减少跟多用时与代码量. 可惜我不会, 埃.
循环\递归以上判断, 循环条件为S.length > 1;
由于N≤10, 不会产生溢出, 或超时
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Tree T = new Tree();
scan.nextInt();
String str = scan.next();
T.CreatTree(str);
T.aftOrder();
}
static class Tree{
char c='$';
Tree LC, RC;
void CreatTree(String S) {
int len = S.length();
//统计0, 1出现次数
int cnt1=0, cnt0=0;
for(char ch: S.toCharArray())
if(ch=='1') cnt1++;
else cnt0++;
if(cnt1==len)
this.c = 'I';
else if(cnt0==len)
this.c = 'B';
else
this.c = 'F';
if(len>1) {
//递归创建左右子树
this.LC = new Tree();
this.RC = new Tree();
this.LC.CreatTree(S.substring(0, len/2));
this.RC.CreatTree(S.substring(len/2, len));
}
else return;
}
void aftOrder() {
if(this!=null) {
if(this.LC!=null)
this.LC.aftOrder();
if(this.RC!=null)
this.RC.aftOrder();
System.out.print(this.c);
}
return;
}
}
}
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复