FBIツリーの2つの解法


【問題の説明】
        “0” “1”          : “0”   B , “1”   I ,  “0”  “1”     F 。
  FBI       ,         F  ,B   I    。      2N “01” S       FBI T,         :

(1)TのルートノードはRであり、そのタイプはシリアルSのタイプと同じである.(2)列Sの長さが1より大きい場合、列Sを中間から分離し、等長の左右のサブ列S 1とS 2に分ける.左サブ列S 1によってRの左サブツリーT 1が構築され、右サブ列S 2によってRの右サブツリーT 2が構築される.長さ2 Nの「01」列を指定し、上記の構造方法でFBIツリーを構築し、その後順ループシーケンスを出力します.【入力ファイル】入力ファイルfbi.inの第1行は整数N(0<=N<=10)であり、第2行は長さ2 Nの「01」列である.【出力ファイル】出力ファイルfbi.outには、FBIツリーのシーケンスループシーケンスである1つの文字列のみが含まれる行が含まれます.
【サンプル入力】
3 10001011
【サンプル出力】
IBFBBBFIBFIIFF【データ規模】40%のデータに対して、N<=2;全てのデータに対してN<=10である.
ツリーの構築
上から下へ、現在のツリー全体のルートノードタイプを格納し、そこから切断して各左右のサブツリーのルートノードタイプを生成します.再帰境界は現在のサブツリーに二分されて空です.


#include 
using namespace std;

int a[20] = {0,1,0,0,0,1,0,1,1};
int s[20] = {0,1,1,1,1,2,2,3,4};//              ,             ,s[3] - s[1]    3 2       。

struct node{
	char data;
	node *l,*r;
};
void create(node *t,int st,int ed)
{
	int sum = s[ed]-s[st-1];
	if(sum == 0)t->data = 'B';
	else if(sum == ed-st+1)t->data = 'I';
	else t->data = 'F';
	
	if(st==ed)return ;
	
	node *L,*R;
	R = new node;
	L = new node;
	R->l = NULL;	R->r = NULL;
	L->l = NULL;	L->r = NULL;
	t->l = L;	t->r = R;
	create(t->l,st,(st+ed)/2);
	create(t->r,(st+ed)/2+1,ed);
}

void print(node *p)
{
	if(p==NULL)return;
	print(p->l);
	print(p->r);
	cout << p->data;
} 

int main()
{
	node *root;
	root = new node;
	root->l = NULL;
	root->r = NULL;
	
	create(root,1,8);
	print(root);
}




ちくじきおくツリー
ルートノードまで下から上へ順にノードを生成

//if(node[k*2]=='B' && node[k*2+1]=='I'|| node[k*2]=='I' && node[k*2+1]=='B'|| node[k*2]=='F' || node[k*2+1]=='F')
#include
using namespace std;
int n,m=1;
char node[10000000];
void houxu(int k)
{
	if(k>=2*m) return;
	houxu(k*2);
	houxu(k*2+1);
	cout << node[k];
	
}
int main()
{
	char ch;
	cin>>n;
	for(int i=1;i<=n;i++)m*=2;
	
	for(int i=m;i<=2*m-1;i++)
	{
		cin>>ch;
		if(ch=='0')
		{
			node[i]='B';
		}else
		{
			node[i]='I';
		}
	}
	
	for(int i = 1; i<2*m; i++)
	cout << node[i] <0;k--)
	{
		//if(node[k*2]=='B' && node[k*2+1]=='I'|| node[k*2]=='I' && node[k*2+1]=='B'|| node[k*2]=='F' || node[k*2+1]=='F')
		if(node[k*2]=='B'&&node[k*2+1]=='B')
		{
			node[k]='B';
		}else if(node[k*2]=='I'&&node[k*2+1]=='I')
		{
			node[k]='I';
		}
		else node[k] = 'F';
	}
	
	houxu(1);
}