【NOIP普及组】 FBI树
- C语言版本
- C++ 版本
- Java版本
- Python版本
💐The Begin💐点点关注,收藏不迷路💐
|
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树[1],它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1)T的根结点为R,其类型与串S的类型相同;
2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历[2]序列。
输入
第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。
输出
输出一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
C语言版本
#include <stdio.h>
#include <string.h>
// 判断字符串是否全为指定字符
int isAllSame(char *str, char ch) {
int i;
int len = strlen(str);
for (i = 0; i < len; i++) {
if (str[i]!= ch) {
return 0;
}
}
return 1;
}
// 计算FBI类型
char fbi(char *str) {
int len = strlen(str);
// 如果字符串长度大于1,递归处理子串
if (len > 1) {
char leftStr[len / 2 + 1];
char rightStr[len - len / 2 + 1];
strncpy(leftStr, str, len / 2);
leftStr[len / 2] = '\0';
strncpy(rightStr, str + len / 2, len - len / 2);
rightStr[len - len / 2] = '\0';
printf("%c", fbi(leftStr));
printf("%c", fbi(rightStr));
}
// 判断字符串是否全为0
if (isAllSame(str, '0')) {
return 'B';
}
// 判断字符串是否全为1
else if (isAllSame(str, '1')) {
return 'I';
}
return 'F';
}
int main() {
int n; // n:输入的整数N,表示后续输入字符串的长度相关信息
scanf("%d", &n);
char s[1024]; // s:存储输入的字符串
scanf("%s", s);
printf("%c", fbi(s));
return 0;
}
C++ 版本
#include <iostream>
#include <string>
// 判断字符串是否全为指定字符
bool isAllSame(const std::string &str, char ch) {
for (char c : str) {
if (c!= ch) {
return false;
}
}
return true;
}
// 计算FBI类型
char fbi(const std::string &str) {
int len = str.length();
// 如果字符串长度大于1,递归处理子串
if (len > 1) {
std::string leftStr = str.substr(0, len / 2);
std::string rightStr = str.substr(len / 2);
std::cout << fbi(leftStr);
std::cout << fbi(rightStr);
}
// 判断字符串是否全为0
if (isAllSame(str, '0')) {
return 'B';
}
// 判断字符串是否全为1
else if (isAllSame(str, '1')) {
return 'I';
}
return 'F';
}
int main() {
int n; // n:输入的整数N,表示后续输入字符串的长度相关信息
std::cin >> n;
std::string s; // s:存储输入的字符串
std::cin >> s;
std::cout << fbi(s) << std::endl;
return 0;
}
Java版本
import java.util.Scanner;
class Main {
// 判断字符串是否全为指定字符
static boolean isAllSame(String str, char ch) {
// 遍历字符串中的每个字符
for (int i = 0; i < str.length(); i++) {
// 如果有任何一个字符与指定字符不同,返回false
if (str.charAt(i)!= ch) {
return false;
}
}
// 如果所有字符都与指定字符相同,返回true
return true;
}
// 计算FBI类型
static char fbi(String str) {
int len = str.length();
// 如果字符串长度大于1,递归处理子串
if (len > 1) {
String leftStr = str.substring(0, len / 2);
String rightStr = str.substring(len / 2);
// 先递归处理左子串并输出结果
System.out.print(fbi(leftStr));
// 再递归处理右子串并输出结果
System.out.print(fbi(rightStr));
}
// 判断字符串是否全为0
if (isAllSame(str, '0')) {
return 'B';
}
// 判断字符串是否全为1
else if (isAllSame(str, '1')) {
return 'I';
}
return 'F';
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n; // n:输入的整数N,表示后续输入字符串的长度相关信息
n = scanner.nextInt();
String s = scanner.next(); // s:存储输入的字符串
System.out.println(fbi(s));
// 关闭Scanner,释放资源
scanner.close();
}
}
Python版本
# Python 3 风格的 print 函数
from __future__ import print_function
def fbi(s):
length = len(s)
# 如果字符串长度大于1,递归处理子串
if length > 1:
left_str = s[:length // 2]
right_str = s[length // 2:]
print(fbi(left_str), end='')
print(fbi(right_str), end='')
# 判断字符串是否全为0
if all(char == '0' for char in s):
return 'B'
# 判断字符串是否全为1
elif all(char == '1' for char in s):
return 'I'
return 'F'
n = int(input()) # n:输入的整数N,表示后续输入字符串的长度相关信息
s = input() # s:存储输入的字符串
print(fbi(s), end='')
💐The End💐点点关注,收藏不迷路💐
|