hrbustoj.G.FBI Tree(2016级新生程序设计全国邀请赛 )

本文介绍了一种特殊的二叉树——FBI树的构造方法,并通过递归算法实现了一个长度为2^N的01串对应的FBI树的构建及后续遍历输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

 

FBI Tree的描述如下:

我们可以把由01组成的字符串分为3类,全0的串成为B串,全1的串成为I串,既含0又含1的串则称为F串。FBI树是一种二叉树,它的节点类型也包括F串节点、B串节点和I串节点三种。由一个 长度为2^N01S可以构造出一颗FBIT,递归的构造方法如下:

(1)   T的根节点为R,其类型与串S的类型相同。

(2)   若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2

现在给出一个长度为2^N01串,请用上述构造方法构造出一棵FBI树,并输出它的后续遍历序列。

Input

第一行为一个正整数T,表示测试数据组数。

每组测试数据第一行为一个整数N0 <= N <= 10),第二行是一个长度为2^N01串。

Output

输出FBI树的后续遍历序列。

Sample Input

2

1

10

3

10001011


Sample Output

IBF

IBFBBBFIBFIIIFF


这道题就是递归加c++ substr 函数的用法(http://blog.youkuaiyun.com/sinat_35121480/article/details/53353558)。

本题代码如下:

#include<iostream>
#include<string>
using namespace std;

char fbitree(string s,int n)
{
	if(n==0)
	{
		if(s[0]=='0')
		{
			cout<<"B";
			return 'B';
		}
		else {
			cout<<"I";
			return 'I';
		}
	}
	else 
	{
		char w=fbitree(s.substr(0,s.size()/2),n-1);
		char v=fbitree(s.substr(s.size()/2,s.size()/2),n-1);
		if(w=='B'&&v=='B')
		{
			cout<<"B";
			return 'B';
		}
		else if(w=='I'&&v=='I')
		{
			cout<<"I";
			return 'I';
		}
		else{
			cout<<"F";
			return 'F';
		}
	}
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		string s;
		cin>>s;
		fbitree(s,n);
		cout<<endl;
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值