FBI树
FBI树
题目描述
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。
FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:
1) T的根结点为R,其类型与串S的类型相同;
2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。
现在给定一个长度为2^N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历2序列。
输入格式
输入的第一行是一个整数N(0<=N<=10),第二行是一个长度为2^N的“01”串。
输出格式
输出包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。
样例输入
3
10001011
样例输出
IBFBBBFIBFIIIFF
解法一:
递归算法
var n,s,i:integer; a:array[1..1024] of char; function find(l,r:integer):char; var ls,rs,ts:char; m:integer; begin if l=r then begin if a[l]='0' then ts:='B' else ts:='I'; write(ts); exit(ts) end else begin m:=l+(r-l+1) div 2; ls:=find(l,m-1); rs:=find(m,r); if ls=rs then ts:=ls else ts:='F'; write(ts); exit(ts); end; end; begin assign(input,'fbi.in');reset(input); assign(output,'fbi.out');rewrite(output); readln(n); s:=1; for i:=1 to n do s:=s*2; for i:=1 to s do read(a[i]); find(1,s); close(input);close(output); end.
解法二:
利用二叉树性质,先存储到数组中,在对树进行后续遍历
{ by hcy 2012.10.24 fbi by binary-tree } var n,s,i,l,r:integer; a:array[1..1024] of char; b:array[1..1024*2] of char; procedure lrtTravel(t,k:integer);//l-r-t begin if k>n then write(b[t]) else begin lrtTravel(t*2,k+1); lrtTravel(t*2+1,k+1); write(b[t]); end; end; begin assign(input,'fbi.in');reset(input); assign(output,'fbi.out');rewrite(output); readln(n); s:=1; for i:=1 to n do s:=s*2; for i:=1 to s do read(a[i]); for i:=s to 2*s-1 do if a[i-s+1]='0' then b[i]:='B' else b[i]:='I'; for i:=s-1 downto 1 do begin l:=i*2; r:=l+1; if b[l]=b[r] then b[i]:=b[l] else b[i]:='F'; end; lrtTravel(1,1); //for i:=1 to 2*s-1 do write(b[i]); close(input);close(output); end.