FBIツリーの2つの解法
2737 ワード
【問題の説明】
(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である.
ツリーの構築
上から下へ、現在のツリー全体のルートノードタイプを格納し、そこから切断して各左右のサブツリーのルートノードタイプを生成します.再帰境界は現在のサブツリーに二分されて空です.
ちくじきおくツリー
ルートノードまで下から上へ順にノードを生成
“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);
}