回 帖 发 新 帖 刷新版面

主题:大家帮忙看看这个遍历问题

【问题描述】已知一棵二叉树的先序和中序遍历,可以求它的后序遍历,相应的,已知一棵二叉树的后序和中序遍历,也能求它的先序遍历。然而给定一棵二叉树的先序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
        a             a                 a                         a
     b            b                          b                        b
 c                    c                 c                                  c
所有的这些二叉树都有着相同的先序和后续遍历,但中序遍历却不相同。
【输入】输入数据共两行,第一行表示该二叉树的先序遍历结果s1,第二行表示该二叉树的后续遍历结果s2。
【输出】输出可能的中序遍历序列的总数,结果不超过长整型数。
【样例】
      travel.in
      abc
      bca

      travel.out
      4

相应的PASCAL语言代码如下:
program E2_3;{Travel}
var s1,s2:string;  {存放原始输入的先序遍历和后续遍历结果}
procedure init;    {初始化,读入两个字符串}
begin
  assign(input,'tranel.in');reset(input);
  readln(s1);readln(s2);close(input);
end;
Function check(f,l:string):boolean;
var i:byte;
begin
  if lenght(f)=0 then check:=true  {空字符串也认为符合条件}
  else
    begin
      check:=true;
      check:=f[l]=l[lenght(l)];  {对比F的首字符和L的尾字符}
      for i:=2 to lenght(f) do   {检查其他字符在F中有的L中也是否有}
      if pos(f[i],l)=0 then check:=false;
    end;
end;
Function count(first,last:string):longint;
var i,len:byte; t:longint
    lf,ll,rf,rl:string;
begin
  if len<=1 then count:=1  {只有1个或0个字符时返回结果1}
     else
       begin
         len:=lenght(last); t:=0;
         for i:=len-1 downto 0 do
           begin
             lf:=copy(first,2,i);  {取先序的左子串}
             ll:=copy(last,l,i);   {取后序的左子串}
             rf:=copy(first,i+2,len-l-i);  {取先序的右子串}
             rl:=copy(last,i+1,len-l-i);   {取后序的右子串}
             if check(lf,ll) and check(rf,rl) then
             t:=t+count(lf,ll)*count(rf,rl);  {递归调用;分布相乘;分类相加}
           end;
       count:=t;
      end;
end;
begin  {main}
  init;
  assign(output,'travel.out');rewrite(output);
  writeln(count(s1,s2));close(output)
end.

能不能把这个代码翻译成C语言代码,谢谢啦。

回复列表 (共1个回复)

沙发


[em1]

我来回复

您尚未登录,请登录后再回复。点此登录或注册