二叉树输出(树)

Description

树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点 的长并等于它的左右子树的长度之和。 
一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始: 
每行输出若干个结点字符(相同字符的个数等于该结点长度), 
如果该结点有左子树就递归输出左子树; 
如果该结点有右子树就递归输出右子树。 
假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。

Input

输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的), 分别表示二叉树的先序遍历和中序遍历的序列。每行的字符个数不超过20个。

Output

输出的行数等于该树的结点数,每行的字母相同。

Sample Input

 

ABCDEFG 
 CBDAFEG 

 

Sample Output

 

AAAA 
BB 


EE 

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
转载时必须以链接形式注明原始出处及本声明。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值