Description
树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点 的长并等于它的左右子树的长度之和。
一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:
每行输出若干个结点字符(相同字符的个数等于该结点长度),
如果该结点有左子树就递归输出左子树;
如果该结点有右子树就递归输出右子树。
假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。
Input
输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的), 分别表示二叉树的先序遍历和中序遍历的序列。每行的字符个数不超过20个。
Output
输出的行数等于该树的结点数,每行的字母相同。
Sample Input
ABCDEFG
CBDAFEG
Sample Output
AAAA
BB
C
D
EE
F
G
解题思路:先根据先序遍历和中序遍历,建立一个二叉树,然后用递归对二叉树的每一个结点进行统计,最后输出每个结点的那个值即可。
程序:
type
tree=^node;
node=record
data:char;
num:longint;
lc:tree;
rc:tree;
end;
var
s1,s2:string;
i:longint;
head:tree;
procedure a1(l1,r1,l2,r2:longint;var bt:tree);
var
s:longint;
begin
s:=pos(s1[l1],s2);
if (s>=l2)and(s<=r2) then
begin
new(bt);
bt^.data:=s1[l1];
end;
if s>l2 then a1(l1+1,r1+s-l2,l2,s-1,bt^.lc)
else bt^.lc:=nil;
if s
else bt^.rc:=nil;
end;
function fbt(bt:tree):longint;
begin
if bt=nil then exit(0);
if (bt^.lc=nil)and(bt^.rc=nil) then
begin
bt^.num:=1;
exit(1);
end;
fbt:=fbt(bt^.lc)+fbt(bt^.rc);
bt^.num:=fbt;
end;
procedure print(bt:tree);
var
j:longint;
begin
if bt=nil then exit;
for i:=1 to bt^.num do
write(bt^.data);
writeln;
print(bt^.lc);
print(bt^.rc);
end;
begin
readln(s1);
readln(s2);
a1(1,length(s1),1,length(s2),head);
i:=fbt(head);
print(head);
end.
版权属于:Chris
原文地址:http://blog.sina.com.cn/s/blog_83ac6af80102v0m3.html
转载时必须以链接形式注明原始出处及本声明。