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
版权声明:本文标题:二叉树遍历的通用非递归算法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1726289469a940264.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论