汇编二叉树的遍历
- 格式:doc
- 大小:314.00 KB
- 文档页数:16
一、软件背景介绍
树的遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算的基础。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
所以二叉树的遍历也包括三种:先序遍历,中序遍历,和后序遍历。
图1:程序显示结果
二、核心算法思想
二叉树的存储:
在内存中为数组binary分配一个大小为63(0,0,0)的存储空间,所有数组元素初始化为0,用来存放二叉树。每三个连续的数组地址存放一个节点:第一个地址存放节点的值;第二个地址存放有无左孩子的信息,如果有则将其置为1,否则为0;第三个地址存放有无右孩子的信息,如果有则将其置为1,否则为0。将binary的首址偏移赋给si,cx初始化为0用来计数,用回车代表输入的为空,即没有输入。按先根存储的方式来存二叉树,首先输入一个字符,若为回车则退出程序,否则cx+3且调用函数root。然后该结点若有左孩子,调用leftchild函数,置该结点标志即第二个地址中的0为1,该结点进栈,再存储左孩子结点,递归调用左右,若没有左孩子,看有没有右孩子,若有,则调用rightchild置该结点标志位即上第三个地址中的0为1,然后该结点进栈,再存储右孩子结点,递归调用左右,整个用cx计数,数组binary中每多一个节点,cx加3。此存储方式正好符合先序遍历思想。遍历二叉树的执行踪迹:
三种递归遍历算法的搜索路线相同,具体线路为:从根结点出发,逆时针沿着二叉树外缘移动,对每个结点均途径三次,最后回到根结点。
二叉树的遍历有常用的三种方法,分别是:先根次序、中根次序、后根次序。为了验证这几种遍历算法的区别,本次的实验将会实现所有的算法。
在搜索路线中,若访问结点均是第一次经过结点时进行的,则是前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是中序遍历(或后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。
先序遍历,中序遍历,后序遍历这三种序列都是线性序列,有且仅有一个开始结点和一个终端结点,其余结点都有且仅有一个前驱结点和一个后继结点。为了区别于树形结构中前驱(即双亲)结点和后继(即孩子)结点的概念,对上述三种线性序列,要在某结点的前驱和后继之前冠以其遍历次序名称。
二叉树的遍历具体步骤:
先序遍历:将binary的首址偏移赋给si,cx用来计数。每显示输出一个节点,则cx加3直接把数组元素下标为0,3,6,……用si遍历下来,每遍历一个结点,要判断si所指数组元素是否是0,是0,结束遍历;不是0,则输出,至到si所指元素为0,则没有结点,此时结束先序遍历。
中序遍历:用数组地址初始化si,然后加cx加3,若结点的第二个地址中的元素为0,打印si,再判断右子树标志位,为1继续,si继续进栈,再用数组地址初始化si,然后加cx,cx再继续加3,否则si出栈,结束中序过程;若结点的第二个地址中的元素不为0,则si 进栈,si加cx,cx继续加3,直到结点的第二个地址中的元素为0,再判断左子树标志位,为1继续,si继续进栈,再用数组地址初始化si,然后加cx,cx再继续加3,否则si出栈,结束中序过程。
后序遍历:后序遍历和中序遍历类似,只是先遍历左孩子,后遍历右孩子,再打印,递归。具体过程,先用数组地址初始化si,然后加cx加3,若结点的第二个地址中的元素为0,打印si,再判断左子树标志位,为1继续,si继续进栈,再用数组地址初始化si,然后加cx,cx再继续加3,否则si出栈,结束中序过程;若结点的第二个地址中的元素不为0,则si 进栈,si加cx,cx继续加3,直到结点的第二个地址中的元素为0,再判断右子树标志位,为1继续,si继续进栈,再用数组地址初始化si,然后加cx,cx再继续加3,否则si出栈,
结束后序遍历。
三、核心算法流程图
汇编实现二叉树程序的主函数,也就是main方法,程序执行的主线路,三种遍历在main 方法中执行:
图2:主程序
汇编程序二叉树的存储,在内存中为数组binary分配一个大小为63(0,0,0)的存储空间,所有数组元素初始化为0,用来存放二叉树:
N
图4:先序遍历
四、源代码
下面给出的是用汇编实现二叉树三种遍历程序的源代码:
.model small
;------------------------------------------------------------------------------
.stack 64
;-----------------------------------------------------------------------------
.data
binary db 63 dup (0,0,0)
MSG1 db 0dh,0ah,'PRESS
MSGB db 0dh,0ah,'Does ',27h,'$'
MSGC db 27h,' have a leftchild? :','$'
MSGD db 27h,' have a rightchild? :','$'
MSGE db 0dh,0ah,'The first root traversing: ','$'
MSGF db 'The middle root traversing: ','$'
MSGG db 'The last root traversing: ','$'
MSGH db 0dh,0ah,'$'