汇编二叉树的遍历

  • 格式:doc
  • 大小:314.00 KB
  • 文档页数:16

下载文档原格式

  / 16
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、软件背景介绍

树的遍历(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 EXPREE NODE HAS NO CHILD ',0dh,0ah,'$' MSGA db 0dh,0ah,'Root: ','$'

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,'$'