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). 

(责任编辑:齐婷婷) 


本文标签: 序列 遍历 还原 结点