admin 管理员组文章数量: 1086019
2024年9月14日发(作者:网页界面设计和素材)
第23卷第1期 电脑开发与应用
文章编号:1003—5850(2010)91—0053—03
二叉树的先序遍历和中序遍历的非递归算法
Discussion and Analysis of Non—recursive Algorithm for Preorder
Traversal and Inorder Traversal of Binary Tree
黄 霞
(西安工程大学计算机科学学院 西安 710048)
【摘 要】从二叉树先序遍历递归算法的执行过程的分析入手,总结出二叉树先序遍历的实质,从而得出利用栈
的二叉树的非递归算法。最后,再从分析二叉树中序遍历与先序遍历过程实质的不同之处,得出了二叉树中序
遍历的非递归算法。重点在于对二叉树先序和中序遍历过程实质的分析。
【关键词】二叉树先序遍历,二叉树中序遍历,栈,递归算法,非递归算法
中图分类号:TP311.12 文献标识码:A
ABSTRACT beginning at the implementation process of binary tree’S preorder traversai,author summary the real of binary
tree’S preorder traversal and obtain non recursive algorithm for binary tree’S preorder traversal using stack.At last.obtaining non
recursive algorithm for binary tree’S inorder traversal fromanalysising the difference between inorder traversal and preorder
traversa1.The importance is analysising of the real for binary tree’S preorder traversal and binary tree’S inorder traversa1.
KEYWORDS binary tree’S preorder traversal,binary tree’
algorithm
1二叉树先序遍历的非递归算法
点的指针,PA就表示指向 结点。ro表示调用此函数
的返回地址;rl表示从左子树调用子函数的返回地
树是应用比较广泛的一种数据结构,二叉树又是
址 2表示从右子树调用子函数的返回地址。
树中常用的一种数据结构。对二叉树的遍历可以应用
到程序设计的各个领域。由二又树的先序及中序遍历
的定义,递归遍历算法书写起来容易,但要对其的执行
过程有一深入的理解,递归遍历算法的执行速度也比
较慢;由此,我们可以找出规律,写出其非递归算法。
二又树的存储表示为:
Typedef struct bitnode
{
Datatype data;
图1二叉树例子
Struct bitnode*lchild,*rchild;
二又树先序遍历递归时栈的变化情形如下:
}bitnode,*bitree;
由二叉树先序遍历的性质,我们得出二叉树先序
从二叉树先序遍历非递归算法实现时系统栈的变
遍历的递归算法:
化情况,我们不难看出,二叉树先序遍历实际上是走丫
一
Preorder(bitree bt)
条从根结点左外侧开始,由根结点右外侧结束的曲
{visit(bt一>data);
线。该路线从根结点开始沿左子树深入下去.深入到最
Preorder(bt一>lchild);
左端,无法再深入下去时,则返回,再逐一进入深入时
Preorder(bt一>rchild);
遇到结点的右子树,再进行如此的深入和返回,直到最
}
后从根结点的右子树返回根结点为止。且深入一个结
由栈与递归的关系,我们知道二叉树先序遍历递 点访问一个结点。
归算法的执行,系统会自动生成一个栈,来完成该算法
在沿左子树深入时,无法再深人下去时,即左子
的执行。下面以一个具体的二叉树为例,给出执行此递
树为空时,就应退回到该结点的右子树,一样是深入时
归算法时栈的情形。假设栈含有两个域,一个为指向结
访问结点。当它的左右子树都走完时,则要退出该结
* 2009—07—30收到,2009—11-20改回
** 黄霞,女,1964年生,学士,工程师,研究方向:计算机软件工程。
二叉树的先序遍历和中序遍历的非递IJ]算法
通过上面的分析及二叉树的二叉链表表示,我们
PD rl
P8 r1
P rl
』 7‘O
』 rO
(1)显示A (2)显示B
, 1
r1
坨
彤 r2
D rl
PD r1 D rl
I,B r1
PB rl ,)B r1
】, rO
PA rO P r0
r2
j ; r2
j D r1
、
P8 r1 r2
4 rO
PA rO
(8)显示C (9)显示E
rl r2
PE rl , r1
PF r2
r2 I℃ r2
彤 r2
PA rO
a rO
,J以 rO
(12)显示F
rl
r2
r2
PF r2
I R r2
门 r2
,JA rO
PA rO
(13) (14) (15)
图2二叉树遍历递归时栈的变化
图3二叉树先序遍历
点,指针指向深入时前一个结点,因此,我们在编写非
递归算法时,就要引人栈这个数据结构。如果该结点的
左右子树仍然都走过,则仍要退栈,若右子树没走过,
则继续深入与返回。而且,我们还可以看到,当栈空且
指针为空时,结束。
我们看到,深入时一定先从左子树开始的,边深入
边访问边进栈,返回时才从右子树进行,并接着退栈与
深入右子树。
可以得出二叉树的先序遍历的非递归算法:
Void pre:order(bitree bt)
{
Stacktype stack[-maxnode];
Bitree P;
Int top一0;
P=bt: 、
I)of
While(p!一nul1)
{visit(p一)>data);
stack[+%top ̄一P;
P—p-)>lchild;
f
P:staek[top ̄;
P—p->rchild;
}while(top>0)
)
表1 二叉树先序非递归遍历过程
步骤 指针P 栈s tack内容 访问结点
初态 一 空
1 上;
2 D .B B
3 A, , ) D
4 G .B
5 ‘4.B。G G
6 .
7 A
8 C 空
9 E C C
】0 C.E
11 C
12 F 空
13 F F
14 空
2二叉树中序遍历的非递归算法
二叉树中序遍历的过程与七面介绍的先序遍历是
一
样的。也是走了相同的路线,也是先深入左子树,当
深入不下去时,返回到前一结点深入其右子树,当指针
为空且栈为空时结束等等。由二叉树中序遍历的性质
可知,它只是在左子树深入不下去,返回到其结点的右
子树前,才对该结点进行访问。而其他的过程都与先序
遍历完全相同,因此,二叉树中序遍历的非递归算法只
是访问结点语句改在p—stack[top]和P—p->rchild
之间 (下转第59页)
第23卷第1期 电脑开发与应用
3 实 验
3.1 ORL人脸数据库
为验证本算法,实验中采用剑桥ORI 人脸数据
库,该数据库由英国剑桥大学的AT&T实验室采集,
包括40人的每人10张人脸灰度图像,共计400张。每
张图像的尺寸为112×92像素,包括表情变化,微小姿
态变化,10 以内的尺度变化。比较充分地反应了同一
个人不同人脸图像的变化和差异。将图像库中的人脸
图像平均分为两组,其中200张为训练样本,另外200
张为测试样本。
3.2 实验结果
为便于比较,选取特征空间维数 一10,训练样本
数k一200。本文算法对样本进行二次小波分解。几种
算法的识别率如表1所示。
表1三种算法识别率比较
识别方法
]
【=
]
识别率(
]
)
]
_寸
PCA 84:.2
2DPCA 89.2
小波变换+2DPCA 92.5
从上面的实验数据我们可以看出:
①传统PCA方法的识别率较低,这主要是因为
传统的PCA方法是基于图像的灰度统计值,外在因素
带来的图像差异和人脸本身带来的图像差异无法区
分。
②与传统PCA方法不同,2DPCA方法最显著地
特点就是采用了最大化类问离散度作为准则,首先利
用了原始图像矩阵来构造图像的协方差矩阵,这样使
得在特征提取上更加直观,总体的计算量也远远小于
传统PCA,所以可以显著地提高图像特征的提取速
度。由于有着更小的样本尺寸,使得图像的方差也更
小,这样计算矩阵的协方差也更为准确,因此,识别率
也有了明显的提高。
⑧通过小波变换,人脸图像的分辨率降低,图像
维数降低,显著地减轻了2DPCA计算复杂度,也节约
了存储空间;同时提供了空问域和频域的局部信息,选
择小波分解的低频分量,由于不包含高频信息,因此削
弱了光线、表情变化和部分附属物对2DPCA算法识
别率的影响,增强了对噪声的鲁棒性。采用基于小波变
换的2DPCA识别方法,可以获得很好的识别效果,同
时降低了运算的复杂度,从而节约了时间。
4结论
实验结果表明,本文提出的算法不仅提高了特征
提取的速度,降低了识别时间,而且识别率和识别速度
也都得到了进一步的改善;同时对于人脸表情变化、姿
态变化、附属物干扰具有一定的鲁棒性。
参考文献
Pentland A.Looking at People: Sensing for
Ubiquitous and Wearable Compu2ting[J].IEEE
Transactions on Pattern AnalMachine Intell,2000,
22(1):107—119.
Belhumeur P N,Hespanha J P,Iengman K R D J.
Eigenfaces VS Fisherfaces:Recognition Using Class
Specific Linear Projection[J].IEEE Transactions on
Pattern AnalMachine Intell,1997,19(7):711-720.
I iu K,Cheng Y Q,Yang j Y.Algebraic Feature
Exaction for Image Recognition based on an Optimal
Diseriminant Ceiterion[J].Patten Recognition。l 993,
26(6):903—911.
Yang J,Zhang David,Yang J Y.Two—dimensional
PCA:a New Approach tO Aappearance—based Face
Representation and Recognition [J]. IEEE
Transactions on Pat{ern Analysis and Machine
Intelligence,2004,26(i):I31一i37.
胡元奎,汪增福.可变光照条件下的人脸图像识别l_J].
中国图象图形学报,2005,1O(7):844—849.
(上接第54页)
.
可以表示如下:
Void inorder(bitree bt)
{
Stacktype stack Fmaxnode;
Bitree P;
Int top一0;
P=bt:
1)o{
While(p!一nul1)
{slack[+@top ̄一P;
P=P ̄lchild:
)
p=stack[top ̄;
visit(p一>data);
P= p- ̄rchild;
}while(top ̄O)
}
参考文献
严蔚敏,吴伟民编著.数据结构((:语言版)[M].北京:
…
清华大学出版社,2008.
L
耿国华编著.数据结构(c语言版)[M].西安:西安电
子科技大学出版社,2003.
[。]
蒋文蓉编著.数据结构EM].北京:高等教育出版社,
2003.
版权声明:本文标题:二叉树的先序遍历和中序遍历的非递归算法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1726249156a932785.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论