数据结构程序设计报告(平衡二叉树).doc_第1页
数据结构程序设计报告(平衡二叉树).doc_第2页
数据结构程序设计报告(平衡二叉树).doc_第3页
数据结构程序设计报告(平衡二叉树).doc_第4页
数据结构程序设计报告(平衡二叉树).doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数 据 结 构 课 程 设 计数学与计算机科学学院数据结构程序设计报告 平衡二叉树 学生姓名: 学 号: 班 级: 指导老师: 报告日期:1. 题目与要求1) . 问题的提出编写已个平衡二叉树,主要是对插入一个元素导致树不平衡的情况进行平衡化处理以及相关的处理。2) 设计的知识点队列的插入,删除,二叉树的建立于销毁,平衡树的平衡化,以及C语言中基础应用于结构等。3) 功能要求(1) .通过不断插入的方式创建一棵平衡二叉树,包括输入结点的关键字和相关信息。(2) 按要求输出创建的平衡二叉树结点,包括 顺序(中序)输出和按层次输出。(3) 插入新增的结点,若结点不存在则插入平衡二叉树,并进行相关调整。(4) 销毁二叉树。(5) 退出菜单界面如下:2. 功能设计算法设计 选择创建平衡二叉树后,利用循环不断插入结点,并进行调整,当输入节点为0时停止进入菜单界面。 在平横二叉树排序树BSTree上插入一个新的数据元素的递归算法可如下描述:() 若BSTree为空树,则插入一个数据元素为e的新结点作为BSTree的根结点,树的深度增1;() 若e的关键字和BSTree的根节点的关键字相等,则不进行插入;() 若e的关键字小于BSTree的根结点的关键字,而且在其左子树中不存在和e形同的关键字的结点,则将e插入在其左子树上,并且当插入之后的左子树的深度加1时,分别就下列不同情况处理之:a. BSTree的跟结点的平衡因子为-1(右子树的深度大于左子树的深度):则将跟结点的平衡因子更改为0,BBST的深度不变;b. BBST的根结点的平衡因子为0(左,右子树的深度相等):则将根结点的平衡因子更改为1,BBST的深度增1;c. BBST的根结点的平衡 因子为1(左子树的深度大于右子树的深度):若BBST的左子树根结点的平衡因子为1,则需进行向左旋平衡处理,并且在右旋之后,将根节点和其右子树根节点的平衡因子更改为0,树的深度不变;若BBST的左子树根结点的平衡因子为-1,则需进行向左,向右的双向旋转平衡处理,并且在旋转处理之后,修改根结点和其左右子树的平衡因子,数的深度不变;() 若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e有相同的关键字的的节点,则将e插入在BBST的右子树上,并且当插入之后的右子树深度增加(+1)时,分别就不同情况处理之。3. 详细设计1)结点类型定义:typedef struct ElemTypeKeyType Key; /键值类型char info20;ElemType;Typedef struct BSTNode ElemType data; int bf ; /结点的平衡因子 struct BSTNode *lchild,*rchild;/左右孩子指针BSTNode,*BSTree;2) 调平二叉树(左右调平方式大体雷同,之具体写出其中一种调平方式)if(插入元素与当前根元素相等) printf(已存在相同关键字的结点n); if(插入元素小于当前根元素) if(插入新结点不成功)return 0;if(插入成功) switch(查看根的平衡因子) case +1: 进行左平衡处理;检查*T的左子树的平衡度,并作相应平衡处理case +1: 令根及其左孩子的平衡因子为0;做右平衡处理;BTree lc; lc指向的结点左子树根结点;rc的右子树挂接为结点的左子树;lc的右孩子为原结点; 原结点指向新的结点lc;break;case -1: rd指向*T的左孩子的右子树根switch(查看右孩子平衡因子) case +1:根的平衡因子为-1;根左孩子的平衡因子为0; break;case 0:令根和根左孩子的平衡因子为0;break;case -1:根平衡因子为0;根左孩子平衡因子为1; break;根右孩子的平衡因子为0;对*T的左子树作左旋平衡处理;对*T作右旋平衡处理;break;case 0: 令根的平衡因子为+1;break;case -1: 令根的平衡因子为-1;break;运行情况:3) 输出: (1)中序输出 采用递归算法对二叉树进行遍历。if(结点不为空) If(遍历左孩子成功) If(遍历结点成功) If(遍历右孩子成功) 返回 真 返回假else(结点为空)返回假(2) 按层次输出 根据队列先进先出的特点,先将第一层结点进队a,对其出出队并输出,同时将其不为空的孩子指针入另一队列b,当a为空时,队b进行出对并输出处理,将结点的不为空的左右孩子入队a,直到b 为空.如此直到两队均为空。根节点入队;While(a,b不同时为空) If(i为奇数) While(a队不空) a中结点出队并输出; If(左孩子不空) 左孩子入队b; If(有孩子不空) 右孩子入队b; If(i为偶数) While(b队不空) b中结点出队并输出; If(左孩子不空) 左孩子入队a; If(有孩子不空) 右孩子入队a; I+;/ 同时记录树的深度具体的运行情况如下 4) 销毁二叉树 销毁二叉树的算法根据递归遍历而来,算法大体相识。 If(根节点不空) If(左子树不空) 销毁左子树; If(右子树不空) 销毁右子树; 销毁相对根节点; 根节点赋空;/留下来以便再次创建二叉树时使用 注意:必须先销毁左右子树,否则先销毁根节点后,无法找到左右孩子指针。5) 退出 退出时询问是否确认退出,确认则退出,否则返回到主菜单4.程序代码设计(1) 函数原形:void CreatBalanceTree(BSTree &T); 功能:调用插入函数,利用循环来进行平衡二叉树的创建。当输入的键值为0 时停止输入。 说明:在输入相关信息时,需要清空缓存区的回车键值。(2) 函数原形:int InsertAVL(BSTree &T,ElemType e); 功能:插入一个结点,如果待插入的结点键值已存在与树中,则返回。 否则找到插入位置,插入。若因插入结点后使二叉树失去平衡。则插入 后根据平衡因子调用相关的函数进行平衡化处理。 说明:这是一个递归的过程。(3) .函数原形:void R_Rotate(BSTree &p); 功能:对以*p为根的二叉树进行右旋处理,处理后的p指向根节点。(4) .函数原形:void L_Rotate(BSTree &p); 功能:对以*p为根的二叉树进行左旋处理,处理后的p指向根节点。(5) .函数原形:void LeftBalance(BSTree &T); 功能:对以指针T所指结点的二叉树进行左平衡旋转处理,本算法结束时。T指向新的根节点。调用了左旋和右旋函数。(6) .函数原形:void RightBalance(BSTree &T); 功能:对以指针T所指结点的二叉树进行右平衡旋转处理,本算法结束时。T指向新的根节点。调用了左旋和右旋函数。(7) .函数原形:int Print_Mid(BSTree T); 功能:采用递归的方式对二叉树进行中序输出。(8) .函数原形:void Destory(BSTree &T); 功能:此算法和递归遍历十分相识。采用递归进行销毁。 说明:销毁的过程中,必须先销毁左右子树,再销毁根结点,否则先销毁根结点后,左右孩子指针无法找到。销毁后T赋空,预留下来进行下一次的创建。(9) .函数原形:int Visit(BSTree T); 功能:输出结点的关键值。成功则返回真。(10) .函数原形:int WideTraverse(BSTree T);功能;进行平衡二叉树的层次输出,同时可以计算出数的深度。5.课程设计总结 (1)调试情况:由于指针处理不当,调试过程中经常出现指针出错的情况,导致程序终止,经过仔细修改后才得以改正。在程序整体设计过程中,由于忽视&的作用而导致程序无法正常运行。(2).感想:通过此次课程设计,让我对数据结构的重要学习内容有了更加深刻的了解,同时也意识到自己还存在很大的不足,还有很多的知识需要完善。在编程的过程中错误时在所难免的,处了要修改错误外还有了解错误的原因。而不是仅仅修改而已。6.参考文献1 数据结构(C语言版) 严蔚宽 吴伟民 编著2 C语程序设计 白燕 尹业安 编著7.附录:程序清单#include#include #define ERROR 0#define TRUE 1#define OK 1#define FALSE 0#define LH 1#define RH -1#define EH 0#define EQ(a,b) (a)=(b)#define LT(a,b) (a)(b)#define LQ(a,b) (a)lchild)if(Visit(T)if(Print_Mid(T-rchild)return OK;return ERROR;else return OK;int Visit(BSTree T)printf(%d ,T-data.Key);return OK;int InitQueue(LinkQueue &Q)Q.front=Q.rear=(QNodeP)malloc(sizeof(QNode);if(!Q.front)return ERROR;Q.front-next=NULL;return OK;int QueueEmpty(LinkQueue Q)if(Q.front=Q.rear)return TRUE;else return FALSE;int EnQueue(LinkQueue &Q,BSTree p)QNodeP q=NULL;q=(QNodeP)malloc(sizeof(QNode);if(!q)return ERROR;q-e=p;q-next=NULL;Q.rear-next=q;Q.rear=q;return OK;int DeQueue(LinkQueue &Q,BSTree &p)QNodeP q=NULL;if(Q.front=Q.rear)return ERROR;q=Q.front-next;p=q-e;Q.front-next=q-next; if(!q-next)Q.rear=Q.front;free(q);return OK;int WideTraverse(BSTree T)LinkQueue Q1,Q2;BSTree p=NULL;int i=1; InitQueue(Q1);InitQueue(Q2);printf(n按层输出:n);if(T)EnQueue(Q1,T);while(!QueueEmpty(Q1)|(!QueueEmpty(Q2)printf(第%d层:,i); if(i%2)while(!QueueEmpty(Q1)DeQueue(Q1,p);Visit(p);if(p-lchild)EnQueue(Q2,p-lchild);if(p-rchild)EnQueue(Q2,p-rchild);elsewhile(!QueueEmpty(Q2)DeQueue(Q2,p);Visit(p);if(p-lchild)EnQueue(Q1,p-lchild);if(p-rchild)EnQueue(Q1,p-rchild);printf(n);i+;printf(该树共有%d层n,i-1);return OK;int InsertAVL(BSTree &T,ElemType e)if(!T)T=(BSTree)malloc(sizeof(BSTNode);if(!T) exit(ERROR);T-data=e;T-lchild=T-rchild=NULL;T-bf=EH;taller=TRUE;else if(EQ(e.Key,T-data.Key)taller=FALSE;printf(树中存在此关键字n);return ERROR;if(LT(e.Key,T-data.Key)if(!InsertAVL(T-lchild,e)return ERROR;if(taller)switch(T-bf)case LH:LeftBalance(T);taller=FALSE;break;case EH:T-bf=LH;taller=TRUE;break;case RH:T-bf=EH;taller=FALSE;break;else if(!InsertAVL(T-rchild,e)return ERROR;if(taller)switch(T-bf)case LH:T-bf=EH;taller=FALSE;break;case EH:T-bf=RH;taller=TRUE;break;case RH:RightBalance(T);taller=FALSE;break;return OK;void LeftBalance(BSTree &T)BSTree lc=NULL,rd=NULL;lc=T-lchild;switch(lc-bf)case LH:T-bf=lc-bf=EH;R_Rotate(T);break;case RH:rd=lc-rchild;switch(rd-bf)case LH:T-bf=RH;lc-bf=EH;break;case EH:T-bf=lc-bf=EH;break;case RH:T-bf=EH;lc-bf=LH;break

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论