admin 管理员组

文章数量: 1087135


2024年9月14日发(作者:greatview)

维普资讯

2006年第6期 福建 电脑 121 

二叉树遍历的通用非递归算法 

徐凤生1李立群2马夕荣2 

(1.德州学院计算机系。山东德州253023 2.山东省农业管理干部学院,山东济南250100) 

【摘要】:对二又树的遍历过程进行了深入的分析,给出了求先序序列、中序序列和后序序列的通用非递归算法。该算 

法只需对二叉树遍历一次即可求出三种遍历序列.算法本身揭示了二又树三种遍历的内在关系。 

【关键字】:递归;栈;算法;遍历 

递归算法.实现从1出发沿虚线进行遍历到2结束的过程。既然 

二叉树是数据结构中最常见的存储形式.在二叉树的应用 这种遍历是一次就能完成的过程.就应该能够写出一个三种遍 

中.常常要求在树中查找具有某种特征的结点,或者对树中全部 

历的通用的非递归算法。分析上述过程可以发现。只需要设置一 

结点逐一进行某种处理。这就提出了“二叉树遍历”的问题.即如 

个拽.即可一次遍历得到二叉树的三种遍历序列。下面说明栈的 

何按某条搜索路径对树中各结点寻访.使得每个结点都被访问 

变化情况: 

1.前言 

首先,(先序访问根结点A),A和1进栈(1表示结点A的 

到且仅被访问一次。遍历算法是树与二又树的基础。由二又树的 

递归定义,约定按照先左(子树)后右(子树)的遍历顺序,可以得 

右子树还未访问),(先序访问A的左子树的根结点B),B和l 

进栈.由于B的左子树为空,所以B和1出栈,(中序访问B),B 

O表示开始遍历结点B的右子树).由于B的右子树 

先序遍历算法:若二叉树为空。则空操作;否则,(1)访问根 

和O进栈(

为空。B和O出栈,(后序访问B).A和1出栈。(中序访问A),A 

结点;(2)先序遍历左子树;(3)先序遍历右于树。 

到以下三种遍历方法: 

C和1进栈,由 

中序遍历算法:若二叉树为空。则空操作;否则,(1)中序遍 

和O进栈.(先序访 A的右子树的根结点C),

于C的左子树为空,C和l出栈.(中序访问C)。C和O进栈,由 

历左于树;(2)访问根结点;(3)中序遍历右子树。 

后序遍历算法:若二叉树为空。则空操作;否则,(1)后序遍 于C的右子树为空。C和0出栈.(后序访问C).A和O出栈, 

历右子树;(2)后序遍历左子树;(3)访问根结点。 

在遍历算法中.递归是普遍的.递归算法具有结构简练、清 

晰、可读性强等优点,但递归算法在执行过程会耗费太多的时问 

和空问。为了追求算法的时空效率,必须将递归算法转化为非递 

上IJ算法。问胚才能得到解决。而要弄清递归算法,则必须清楚算 

法执行过程中栈的变化情况.这样才能设计出较好的非递归算 

法。l侄目前见到的资料中.大多将先序遍历和中序遍历与后序遍 

历分别讨论。本文通过对二叉树遍历过程的分析.给出了二叉树 

(后序访问A),此时栈已空,遍历过程结束。 

从上面可知,每个结点进栈、出栈都是两次。若进栈前访问 

该结点,则得到先序序列ABC;若在第一次出栈时济问该结点, 

则得到中序序列BAC:若在第二次出栈时访问该结点,则得到后 

序序列BCA。因此.只需对二叉树遍历一次即可得到三种遍历序 

列 这里的关键是设置了一个标志位.用来说明该结点的右子树 

是否已访问.以此表示该结点是第一次出栈还是第二次出栈。 

2 

遍历的通用非递归算法。只需一次遍历即可求出三种遍历序列, 

算法本身揭示了二叉树三种遍历的内在关系。设二叉树与栈的 

结构如下(用C语言描述): 

typedef sl ̄lel BiTN ̄ef 

char data; 

8u niTNode*lehild.‘rehild; 

lBrrNode.‘Bi'I’re-e; 

typedef 8h m elemlypel 

BiTreeI; 

int r.'//r用于标盎t的右予树是否已遍所.嚣已靖所为0,否则为1 

)elemtype; 

typealer sti-ue|shuzul 

char data; 

曰 

圉1三种遍历示意团 

int xh;//xh为l表示此时的da 为先序越历时的元誊.xll为2_丧 此时的dalH为中序 

遍历时的元索.xIl为3寝示此时的data为后序温历时的元豢 

} u Il1idM l ulidM且x】存放追所日Ij访问的元霉,用xh的值区分各种遍历结果 

iyp ̄lef ̄lrat:l 

elemtype base; 

elemty ̄ top; 

3二叉树遍历的通用非递归算法 

二叉树遍历的通用非递归算法描述如下: 

(1)韧始化栈s;sum=O; 

(2)f0r(p.£=T:p. ’.t ̄.p.t->bhild) 

I 

) ̄stack; 

2.二叉树的遍历过程分析 

二叉树中的每个结点只有两个分支(左和右)。这是我们解 

决问题的关键所在 以图1为例对二叉树的遍历过程进行分析, 

我们不难发现.三种遍历的本质区别在于访问根结点和遍历左、 

右子树的先后顺序不同 图中用带箭头的虚线表示了这三种遍 

xulie[sum].data=p.t->data;,/先序vislt(p.t一>data) 

xulie[sum].xh=l: 

SUm++: 

p.r=l 表示p,t的右予树还来访问 

push(¥.p);//p进拽 

} 

(3)若栈s非空.则 

历算法的递归执行过程。其中,向下的箭头表示更深一层的递归 

调用.向上的箭头表示从递归调用退出返回。虚线旁边的三角 

形、圆形和方形内的字符分别表示在先序、中序和后序遍历二叉 

树中访阃结点时输出的信息。由此。只要沿虚线从1出发到2结 

束.将沿途所见的三角形(或圆形、或方形)内的符号记下,便得 

I 

pop(S.p):lip I{1栈 

. 

遍历二叉树的先序(或中序、或后序)序列。 

要想给出三种遍历算法的非递归程序.就是要设计一个非 

xulie[sum].data=p.t->data;|| 碍visitlp.t一>data) 

xulie[su mI.xh=3; 

sum++; f下转第4l页) 

维普资讯

2006年第6期 福建 电脑 41 

3.1集成框架 

行转换的模式.并不存储具体的数据.具体实现时。为给每个异构 

xML能够表达半结构化数据.将多个应用程序所生成的数 

数据源提供一个其包装器(wrapper),由它负责为该相应的数据 

据统一到虚拟XML文件并传送到客户机上.被解析出来的XML 源提供存取机制.它定义了关系模型和DOM对象数据模型之问 

数据可以被编辑或者操纵.因此.把XML作为数据描述和转换工 

的映射.如图2所示. 

具来构造数据集成的中间层.不仅能够适应Web的发展需要。而 

且还将简化Web数据源集成系统的实现.我们的集成框架如图 

1所示. 

圈2信息谭屡/ 中间件层箱}勾 

XML模式与关系模式的转换的核心与实质就是按XPDL 

编写的转换规则和转换规则的执行解释方法.下面就依次分别 

介绍从XML模式到关系模式的转换规则的组成部分和执行方 

陋1摹统^虚捏曩 

法.以及从关系模式到XML模式的转换规则的组成部分和执行 

系统分为四层结构.分别叙述如下: 

方法.从XML模式到关系模式转换的转换规则脚本:由关系模式 

1)应用层.用户界面层.为用户的综合应用提供支持.例如:进 的定义和XML模式到关系模式转换规则的定义组成:从关系模 

式到XML模式转换的转换规则脚本:由关系模式的定义和关系 

行综合数据查询、决策支持和深层次的数据挖掘等服务. 

2)XML接El层.依据特定的转换协议,负责把应用层的应用 模式到XML模式转换规则的定义组成. 

请求传送到XML中间层.一方面。实现保持XML数据的一致性。 

4.结束语 

从简单的读/写到复杂的事务操作:另一方面.接口必须实现必要 

由于XML是一种类似于HTML被设计用来描述数据的语 

的访问控制策略.防止非法访问. 

言。通过XML我们可以实现异构数据的集成、共享及利用提高 

3)XML中问件层.提供必要的数据转换功能或者工具。进行 

了信息系统的整体效能。当然在做这些工作的时候,我们也应该 

数据与XML格式的相互转换。将数据存储到XML数据空间中。 

注意到应用系统所处行业的规范化以及相关的国际标准.这对 

并且维护XML数据空间与各异构数据源之间的影射关系. 于未来信息系统的发展前景有着非常重要的意义。进一步的工 

41信息源层.系统所集成数据的来源.它包括各种数据.例如: 

作主要集中在设计一种数据源描述语言.用以描述源数据与集 

数据库、文本数据和其它多媒体数据等。 

3.2系统实现技术 

成模式问的映射.最终完成用户对集成视图的操纵转换成对数 

据源的有效操纵。 

参考文献: 

1.娄渊胜.尹燕敏.王志坚.基于CORBA的通用数据存取中间件研究及 

为了完成异构数据库问的通讯.必须实现RDBMS---}XM 

RDBMS的转换.一个具体的XML模式到关系模式的数据转换. 

需要涉及较为复杂的XML格式分析处理相应的数据库操作及 

有效性校验.我们通过对XML的数据模型与关系模型的特征的 

比较,认为两者转换的实质:f1)从XML中的数据(存在方式可以 

是Content、属性值、元索名等1到关系模式中字段的映射;(2】从 

XML中数据的相互位置关系到关系模式中元组与元组的关系 

及元组与字段的关系的映射.在数据管理上.我们采用“虚拟 

XML文件”的思想.即所有数据的变化请求都通过XML中问件 

层进行存取操作.而中问件层只存储所有异构数据和XML问进 

+-—卜-+-+-+-+-—卜*+-+-—卜-+一+- ,+r-+--+-..+---+一十-+-— 

实现U].小型微型计算机系统.2001。22(1O):210—212. 

2.靳强勇,李冠宇.张 傻.异构数据集成技术的发展和现状Ⅱ].计算机工 

程与应用.2002,3801):112 114. 

3.李军怀.用明空,耿圜华.张景.XML在异构数据集成中的应用研究Ⅱ】. 

计算机应用.2002.22(9):10-12. 

4.柴晓路.X/VlL数据环境下基于关系模式的数据交换方法IDB/OU. 

http://www.digitalearth.tier.cn/GISRdatcdlTls sues/X/VlL/XMLdata.htm 

-+-+-+ +-+-+-+一十--k---l--+-+-- ̄--+-+ 

(上接第121页) 

l 

e]se 

I 

xulie[sum].data=p.t->data;//中序visit(p.t->data) 

xulie[sum],xh=2; 

p.FO;/,表示开始访问p.t的有子树 

push(S.p)://p进栈 

to,(p.t---p t一>tehild;p.I;p.t---p.t->lchild) 

I 

例如若输人为ABC((DE(G( (((,其中(为空格。则数组xulie 

中的值为: 

由上面的数组可以看出.由xulie.xh值为1的字符依次组成 

的序列即为先序序列.由xulie.xh值为2的字符依次组成的序列 

即为中序序列.由xulie.xh值为3的字符依次组成的序列即为后 

序序列。 

本文通过对二叉树遍历过程的分析.给出了求先序序列、中 

序序列和后序序列的通用非递归算法.只需对二叉树遍历一次 

即可求出三种遍历序列.该算法本身揭示了二叉树三种遍历过 

程的内在关系 

参考文献: 

1.严蔚牧。昊伟民蝙著.敷据结构.北京:清华大学出版社,2002. 

2.尹德辉,孟林。李忠等.二叉树后序遍历的非递归算法讨论.西南民族 

大学学报.2003.5. 

3.黎远松.一种生成二又树遍历序列的新方法.四川轻化工学院学报。 

2o03.4. 

xulle[sum].data=p.卜>d山 ,先序visit ̄.t->data) 

xulie[sum].xh=l: 

SuI11++: 

P.r=l: 

push(S,p】; 

l 

J 

B C C C B D E 8 G G G E D F F F D B ^ ^ 

l l 2 3 2 l l 2 l 2 3 3 2 l l 3 3 3 2 3 


本文标签: 遍历 数据 算法 递归