当前位置:主页 > 电脑教程 > 数据库 > 数据库综合

第六节 根据两种遍历顺序确定树结构

时间:2010-08-18 | 栏目:数据库综合 | 点击:

第六节 根据两种遍历顺序确定树结构

一、由两种顺序确定树结构
    遍历二叉树有三种规则:
    前序遍历:根—左子树—右子树;
    中序遍历:左子树—根—右子树;
    后序遍历:左子树—右子树—根;
    由于前序遍历的第一个字符和后序遍历的最后一个字符为根,中序遍历中位于根左方的子串和位于根右方的子串分别反映了左子树和右子树的结构,因此二叉树的形态可以由其中序与后序或者前序与中序唯一确定。但无法反映左子树和右子树结构的前序遍历与后序遍历却不能做到这一点,因此这两个遍历顺序可对应多种二叉树的形态。

二、由中序遍历与后序遍历确定前序遍历
    由二叉树的遍历规则可以看出,后序遍历的最后一个字 符为根,中序遍历中位于该字符左侧的子串为左子树中序遍历的结果;中序遍历中位于该字符右侧的子串为右子树中序遍历的结果。
    设 中序遍历s1='s1…sk …sn'
       后序遍历s2='s1……sn'
    显然,后序遍历中的sn为二叉树的根。按照前序遍历的规则输出sn。在中序遍历中与sn相同的字符为sk。若k>1,说明左子树存在,位于sk左侧的子串s1…sk-1为左子树中序遍历的结果,后序遍历中的前缀s1…sk-1为左子树后序遍历的结果;若k<n,说明右子树存在,位于sk右侧的子串为右子树中序遍历的结果;后序遍历中的sk…sn-1为右子树后序遍历的结果。按照按照前序遍历的规则分别递归二叉树的左子树和右子树。
 

procedure solve1(s1,s2:string); { 计算和输出中序遍历s1和后序遍历s2对应的前序遍历}
var
  k:integer;
begin
  if length(s2)=1   {若当前子树仅剩一个节点,则输出}
     then write(s2)
     else begin
           k:=pos(s2[length(s2)],s1);{在中序遍历中寻找子树根}
           write(s1[k]);
           if k>1            {若左子树存在,则递归遍历左子树}
              then solve1(copy(s1,1,k-1),copy(s2,1,k-1));
           if k<length(s1)   { 若右子树存在,则递归遍历右子树}
              then solve1(copy(s1,k+1,length(s1)-k),copy(s2,k,length(s2)-k));
          end;
end;

三、由中序遍历与前序遍历确定后序遍历
    原理同前,程序略微有些不同,看下面:

procedure solve2(s1,s2:string);{计算和输出中序遍历s1和前序遍历s2对应的后序遍历}
var
   k:integer;
begin
   if length(s2)=1   {若当前子树仅剩一个节点,则输出}
      then write(s2)
      else begin
            k:=pos(s2[1],s1);  {在中序遍历中寻找子树根}
            if k>1        {若左子树存在,则递归遍历左子树}
               then solve2(copy(s1,1,k-1),copy(s2,2,k-1));
            if k<length(s1) { 若右子树存在,则递归遍历右子树}
            then solve2(copy(s1,k+1,length(s1)-k),copy(s2,k+1,length(s2)-k));
          end;
    write(s1[k]);{或者输出子树根s2[1]}
end;

您可能感兴趣的文章:

相关文章