pascal(21)

来源:百度知道 编辑:UC知道 时间:2024/05/31 20:00:20
题目:FBI树

问题编号:21 [提交该题] [讨论该问题] [Who AC?] [有关讨论]

本题我的状态:Unlogon

题目类型 尚未设置
描述 我们可以把由“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

【算法分析】
此题的后序遍历适合用递归算法完成。由题目可知,输入数据给出的字符为所要遍历的fbi树的叶结点代码,又因为字符串的长度为2的整数次幂,故此fbi树为完全二叉树。由于题中明确规定:子符串中的字符都是‘0’,为B串;都是‘1’,为I串;既有‘0’又有‘1’,为F串。即:二叉树的子结点都是B,父结点为B;子结点都是I,父结点为I;既有I又有B,父结点为F。因此,根据树的子结点可以求出父结点。我们要做的是根据子结点后序遍历二叉树。基本算法为:
procedure bianli(x,y:integer);//遍历过程;x,y:为子结点在数组a中的位置。
begin
if x=y then 输出叶结点 //结束递归条件,结点为一个字符。
else begin
求出父结点;
遍历左子树;
遍历右子树;
输出父结点;
end;
end; //递归算法,详情请参阅程序清单。
【数据结构】
var a:array[1..10000]of '0'..'1';
【程序清单】
program fbi;

var a:array[1..10000]of '0'..'1';

n,i,l:integer;

f1,f2:text;

treeb,treei:boolean;

tree:char;

procedure bianli(x,y:integer); {递归过程,x,y为所要遍历的树的叶结点在数组a中位置}

begin

if x=y then case