实验报告平衡二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
一、需求分析
1、问题描述
利用平衡二叉树实现一个动态查找表。
(1)实现动态查找表的三种基本功能:查找、插入和删除。
(2)初始时,平衡二叉树为空树,操作界面给出查找、插入和删除三种操作供选择。每种操作均要提示输入关键字。在查找时,如果查找的关键字不存在,则把其插入到平衡二叉树中。每次插入或删除一个结点后,应更新平衡二叉树的显示。
(3)每次操作的关键字都要从文件中读取,并且关键字的集合限定为短整型数字{1,2,3······},关键字出现的顺序没有限制,允许出现重复的关键字,并对其进行相应的提示。
(4)平衡二叉树的显示采用图形界面画出图形。
2、系统功能
打开数据文件,用文件中的关键字来演示平衡二叉树操作的过程。
3、程序中执行的命令包括:
(1)(L)oad from data file //在平衡的二叉树中插入关键字;
(2)(A)ppend new record //在平衡的二叉树中查找关键字;
(3)(U)pate special record //显示调整过的平衡二叉树;
(4)(D)elete special record //删除平衡二叉树中的关键字;
(5)(Q)uit //结束。
4、测试数据:
平衡二叉树为:
图 1 插入关键字10之前的平衡二叉树
插入关键字:10;
调整后:
图 2 插入关键字10之后的平衡二叉树
删除关键字:14;
调整后:
图 3 删除关键字14后的平衡二叉树查找关键字:11;
输出:The data is here!
图 3 查找关键字11后的平衡二叉树
二、概要设计
本次实验目的是为了实现动态查找表的三种基本功能:查找、插入和删除。动态查找表可有不同的表示方法,在此次实验中主要是以平衡二叉树的结构来表示实现的,所以需要两个抽象数据类型:动态查找表和二叉树。
1、动态查找表的抽象数据类型定义为:
ADT DynamicSearchTable
{数据对象D :D是具有相同特性的数据元素的集合。各个数据元素均含
有类型相同,可唯一标识数据元素的关键字。
数据关系R :数据元素同属于一个集合。
基本操作P :
InitDSTable(&ST);
操作结果:构造一个空的动态查找表DT。
DestroyDSTable(&DT);
初始条件:动态查找表DT存在。
操作结果:销毁动态查找表DT。
SearchDSTable(DT,key);
初始条件:动态查找表DT存在,key为和关键字类型相同的给丁值。
操作结果:若DT中存在其关键字等于key的数据元素,则函数值为
该元素的值或在表中的位置,否则为“空”。
InsertDSTable(&DT,e);
初始条件:动态查找表DT存在,e为待插入的数据元素。
操作结果:若DT中不存在其关键字等于e,key的数据元素,则插入
e到DT;
DeleteDSTable(&DT,key);
初始条件:动态查找表DT存在,key为和关键字类型相同的给定值。
操作结果:若DT中存在其关键字等于key的数据元素,则删除之。
}ADT DynamicSearchTable
2、二叉树抽象数据类型的定义为:
ADT BinaryTree
{数据对象D :D是具有相同特性的数据元素的集合。
数据关系R :
若D=¢,则R=¢,称BinaryTree为空的二叉树;
若D≠¢,则R={H},H是如下二元关系:
(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;
(2)若D—{root}≠¢,则存在D—{root}={D1,Dr},且D1∩Dr=¢;
(3)若D1≠¢,则D1中存在唯一的元素x1,<root,x1>∈H,且存在D1上的关系H1∈H;若Dr≠¢,则Dr中存在唯一的元
素xr,<root,xr>∈H,且存在Dr上的关系Hr∈H;H={<root,
x1>,<root,xr>,H1,Hr};
(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是符合本定义的二叉树,称为根的右子树。
基本操作P:
InitBiTree(&T);
操作结果:构造空的二叉树T;
DestroyBiTree(&T);
初始条件:二叉树T存在。
操作结果:销毁二叉树T。
CreateBiTree(&T,definition);
初始条件:definition给出T的定义。
操作结果:按definition构造二叉树T。
BiTreeEmpty(T);
初始条件:二叉树T存在。
操作结果:若T为空二叉树,则返回TRUE,否则FALSE。
LeftChild(T,e);
初始条件:二叉树T存在,e是T中某个结点。
操作结果:返回e的左孩子。若e无左孩子,则返回“空”。
RightChild(T,e);
初始条件:二叉树T存在,e是T中某个结点。
操作结果:返回e的右孩子。若e无右孩子,则返回“空”。
InsertA VL(T,e,taller);
初始条件:二叉树T存在,e为要插入的结点,taller反映T长高与否。
操作结果:若在平衡二叉树中不存在和e相同关键字的结点,则插入一个数据元素为e的结点,并返回1,否则返回0。若因插入而使
二叉排序树失去平衡,则旋转处理。
RightProcess(T);
初始条件:二叉树T存在。
操作结果:对以T为根的二叉树做右旋转处理,处理之后T指向新的树根结点。
LeftProcess(T);
初始条件:二叉树T存在。
操作结果:对以T为根的二叉树做左旋转处理,处理之后T指向新的树根结点