数据结构程序报告(平衡二叉树的操作)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学学院数据结构课程设计报告
平衡二叉树操作
学生姓名:
学号:
班级:
指导老师:
报告日期:
1.需求分析
1.建立平衡二叉树并进行创建、查找、插入、删除等功能。
2.设计一个实现平衡二叉树的程序,可进行创建、查找、插入、删除等操作,实现动态的输入数据,实时的输出该树结构。
3.测试数据:自选数据
2.概要设计
1.抽象数据类型定义:
typedef struct BSTNode {
int data;
int bf; //节点的平衡因子
struct BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree;
void CreatBST(BSTree &T); //创建平衡二叉树
void R_Rotate(BSTree &p); //对以*p为根的二叉排序树作左旋处理
void L_Rotate(BSTree &p); //对以*p为根的二叉排序树作左旋处理
void LeftBalance(BSTree &T); //对以指针T所指结点为根的二叉树作左平衡旋转处理void RightBalance(BSTree &T); //对以指针T所指结点为根的二叉树作右平衡旋转处理bool InsertAVL(BSTree &T,int e,bool &taller); //插入结点e
bool SearchBST(BSTree &T,int key); //查找元素key是否在树T中
void LeftBalance_div(BSTree &p,int &shorter); //删除结点时左平衡旋转处理
void RightBalance_div(BSTree &p,int &shorter); //删除结点时右平衡旋转处理
void Delete(BSTree q,BSTree &r,int &shorter); //删除结点
int DeleteA VL(BSTree &p,int x,int &shorter); //平衡二叉树的删除操作
void PrintBST(BSTree T,int m); //按树状打印输出二叉树的元素
2.主程序的流程
3.各模块之间的层次调用
3.详细设计
1.以平衡二叉树的插入和平衡化为例:
bool InsertAVL(BSTree &T,int e,bool &taller)
{
//若存在平衡的二叉排序树T中不存在和e有相同关键字的节点,则插入一个数据元素为e //的新结点,并返回1,否者返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转理,//布尔变量taller反映T长高与否。
if(!T)//插入新结点,树“长高”,置taller为true
{
T = (BSTree)malloc(sizeof(BSTNode));
T->data = e;
T->lchild = T->rchild =NULL;
T->bf = EH; taller = true;
}
else
{
if(EQ(e,T->data)) //树中已存在和有相同关键字的结点
{ taller = false;printf("已存在相同关键字的结点\n"); return 0; }//则不再插入
if(LT(e,T->data)) //应继续在*T的左子树中进行搜索
{
if(!InsertA VL(T->lchild,e,taller)) return 0;//未插入
if(taller) //已插入到*T的左子树中且左子树“长高”
switch(T->bf) //检查*T的平衡度
{
case LH: //原本左子树比右子树高,需要作左平衡处
理
LeftBalance(T); taller = false; break;
case EH: //原本左子树、右子等高,现因左子树增高
而使树增高
T->bf = LH; taller = true; break;
case RH: //原本右子树比左子树高,现左、右子树等
高
T->bf = EH; taller = false; break;
}//switch(T->bf)
}//if
else //应继续在*T的右子树中进行搜索
{
if(!InsertA VL(T->rchild,e,taller)) return 0;//未插入
if(taller) //已插入到*T的右子树中且右子树“长高”
switch(T->bf) //检查*T的平衡度
{
case LH: //原本左子树比右子树高,现左、右子树等
高
T->bf = EH; taller = false; break;
case EH: //原本左子树、右子等高,现因右子树增高
而使树增高
T->bf = RH; taller = true; break;
case RH: //原本右子树比左子树高,需要作右平衡处
理
RightBalance(T); taller = false; break;
}//switch(T->bf)
}//else
}//else
return 1;
}//InsertAVL
2.说明:执行完输入函数后,会在键盘缓冲区中保存回车键,后面再对字符型量赋值时,会将缓冲区当成数据存入变量中,所以要在某些输入语句后面加getchar 函数。
4.调试分析
1.遇到的问题:
(1)对平衡二叉树的删除的算法设计程序存在很大问题。删除节点后需要对新的排序树平衡化,改变节点的信息,使之形成一棵新的平衡二叉树。
(2)主函数中的实参和子函数中的实参相等,造成调用该子函数时,虽然没有错误,但其功能不能正确的实现。改变该变量后程序成功实现各种功能。
(3)一些逻辑逻辑运算符书写不正确,造成实现的功能不正确或程序死循环。……
2.收获:
(1)对平衡二叉树的构造、插入和删除的算法思想有了更清楚的认识,能够对平衡二叉树进行创建、调平、插入、删除等操作,实现动态的输入数据,实时的输出该树结构.
(2)对多个程序的调用