题目描述
我们可以把由“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从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。 现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。
输入
输入的第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。
输出
输出包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
提示
[提交]
我们可以把由“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从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。 现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。
输入
输入的第一行是一个整数N(0 <= N <= 10),第二行是一个长度为2N的“01”串。
输出
输出包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
提示
[提交]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct TreeType
{
char Data[1025];
struct TreeType *Lch,*Rch;
} ;
void Copy(char Str[], char Source[])
{
unsigned i;
for(i=0;i<=strlen(Source)-1;i++) Str[i]=Source[i];
Str[i]='\0';
}
void Average(char Str[], char StrL[], char StrR[])
{
unsigned i,Length;
Length=strlen(Str);
for (i=0;i<=Length/2-1;i++)
{
StrL[i]=Str[i];
StrR[i]=Str[Length/2+i];
}
StrL[i]='\0';
StrR[i]='\0';
}
void Create(struct TreeType *Root, char Str[])
{
struct TreeType *TempTree;
char StrL[1025],StrR[1025];
Copy(Root->Data,Str);
if (strlen(Str)>1)
{
TempTree=(struct TreeType*)malloc(sizeof(struct TreeType));
TempTree->Lch=NULL;
TempTree->Rch=NULL;
Root->Lch=TempTree;
TempTree=(struct TreeType*)malloc(sizeof(struct TreeType));
TempTree->Lch=NULL;
TempTree->Rch=NULL;
Root->Rch=TempTree;
Average(Str,StrL,StrR);
Create(Root->Lch,StrL);
Create(Root->Rch,StrR);
}
}
char FBI(char Data[])
{
unsigned i;
for(i=0;i<=strlen(Data)-1;i++)
if (Data[i]!=Data[0]) return'F';
if (Data[0]=='0') return 'B';
else return 'I';
}
void PostOrder(struct TreeType *Root)
{
if (Root!=NULL)
{
PostOrder(Root->Lch);
PostOrder(Root->Rch);
printf("%c",FBI(Root->Data));
}
}
int main()
{
struct TreeType *Tree;
char Str[1025];
int n;
scanf("%d%s",&n,Str);
Tree=(struct TreeType *)malloc(sizeof(struct TreeType));
Tree->Lch=NULL;
Tree->Rch=NULL;
Create(Tree,Str);
PostOrder(Tree);
return 0;
}