admin 管理员组文章数量: 1086019
2024年9月13日发(作者:关于异步电动机的描述正确的是)
电火理_T
2010年3月 Study of Science and Engineering at RTVU. 第1期 总第242期
利用遍历序列还原二叉树算法的研究与实现
李丽姝
辽阳职业技术学院(辽阳1l1004)
摘要二叉树是一种常用的数据结构,根据二又树的遍历规律可以还原出相应二叉树,对还原过
程进行分析并给出C语言实现程序。
关键词二叉树遍历递归
二叉树是一种常用的数据结构,它在计算机
处理领域有着广泛的应川。二义树最基本的运算
就是遍历。根据访问根结点、左子树、右子树的
1 由前序和中序遍历序列还原二叉树
顺序,二叉树的遍历有三种,前序遍历、中序遍
用 ;分别表示前序序列的第一个、最后一
历和后序遍历。前序遍历的顺序为:DLR,即先
个元素,川k,h分别表示中序序列的第一个、
根结点,然后左子树、右子树,故也称先序遍历;
最后一个元素。
中序遍历顺序为:LDR,先左子树,然后根结点、
在前序序列中的第一个结点即为二义树的
右子树;后序遍历顺序为:LRD,先左子树,然 根结点,其位置为i。在中序序p-0中找到根结点
后右子树,最后根结点。
位置(m),以确定左右子树上的结点(m左边为
由前序遍历 1中序遍历序列或者由中序遍
左子树结点,右边为右子树结点)。然后再到前
历和后序遍历序列都可以唯一确定一棵二义树,
序序列中去确定左右子树的根:若m为中序序
所以我们可以根据遍历序列还原出对应的二义
列中第一个元素,则根结点左子树为空,否则递
树。根据遍历序列还原一棵二义树的基本过
归还原左子树,左子树结点在前序序列中的位置
为:先还原根结点,再还原左子树和右子树,可 为i+l--)i+m.k,在中序序列中位置为k m.1;
以由前序或后序序列确定根结点,然后再利川中
若m为中序序列的最后一个元素(位置为h),
序序列确定左右子树中的结点。 则右子树为空,否则递归还原右子树,右子树结
下面给出用C语言描述的算法。假设二二义
点在前序中位置为i+m.k+l i,中序序列中位置
树的前序序列、后序序列和中序序列分别存放在 为m+l m.h。 序实现如 :
一
维数组pre[]、post[】与in[]中,并假设
BtreeNode preintotree(char pre[】,char
叉树各结点的数据值均不相同。二义树结点类型
in[],int i,int j,int k,int h)
定义为:
{intm;
struct BtreeNode
BtreeNode p;
{char data;
p:(BtreeNode )malloc(sizeof(BtreeNode));
struct node*lchild,*rchild;
p一>data= (pre+i);
54. 电人理_T 总第242期
er=k;
while( (jn+m)!= (pr.e+i))
m++:
if(m==k、
p->ichild=NULL;
else
p->lehild=preintotree(pre,in,i+l,i+m-k,k,m一1)
,
if(m:=1)
p->rchild=NULL;
else
p->rchild=preintotree(pre,in,i+m—k+l,j,m+l,J)
,
return p;//还原出来的二:义树,根结点指针
为P,作为返同值返同。
)
2 由后序和中序遍历序列还原二叉树
与l过程相似,刚i,i分别表示后序序列的
第一个、最后一个元素,用k,h分别表示中序序
列的第一个、最后一个元素。
在后序序列中的最,『斤一个结点即为二义树
的根结点,其位置为i。在中序序列中找到根结
点位置(m),以确定左右子树上的结点(m左边
为左子树结点,右边为右子树结点)。然后再剑
后序序列中去确定左右子树的根:若m为中序
序列中第一个元素,则根结点左子树为空,否则
递归还原左子树,左子树结点在后序序列中的位
置为i i+m.k.1,在中序序列中位置为k m一1;
若m为中序序列的最,『i彳一个元素(何置为h),
则右子树为空,否则递!J1=还原右子树,右子树结
点在后序中位置为i+m.k i.1,中序序列中位置
为m+l h。 序段代码如下:
/ 函数BtreeNode postintotree(char post【】,
char in[],int i,intj,int k,int h)部分代码 /
p一>data (post+j);
er=k;
while( (in+m)l= (post+j))
m++:
if(m==k
p->lchild=NULL;
else
p->lchild=postintotree(post,in,
i,i+m—k—I,k,m-I);
if(m==h)
p->rchild=NULL;
else
p->rchild=postintotree(post,in,
i+m-k,j一1,m+l,h);
3总结
二二义树的定义本身就是个递归的定义,所以
二叉树遍历和还原也可采 递归的方式进行,算
法容易理解,若采J1j非递归的方法虽也可实现,
但是算法会复杂得多,不易理解,算法 写也很
困难。所以二义树相关的运算不妨首先考虑递归
方法。
参考文献
f1]许卓群.数据结构.北京:中央广播电视大学f{J社.2002.
【2】谭浩强,张 温.c,c++语言程序设计教程.北京:高等教
育Ⅲ版礼.2001.
【3】郝l5n I5几.二叉树遍历方泫的研究和心用.内江科
技.2008(4).
(责任编辑:齐婷婷)
版权声明:本文标题:利用遍历序列还原二叉树算法的研究与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1726230198a929522.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论