数据结构程序报告(平衡二叉树的操作)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)对多个程序的调用

相关文档
最新文档