数据结构平衡二叉树课设报告

上传人:ta****u 文档编号:223775596 上传时间:2023-07-21 格式:DOCX 页数:24 大小:266.01KB
收藏 版权申诉 举报 下载
数据结构平衡二叉树课设报告_第1页
第1页 / 共24页
数据结构平衡二叉树课设报告_第2页
第2页 / 共24页
数据结构平衡二叉树课设报告_第3页
第3页 / 共24页
资源描述:

《数据结构平衡二叉树课设报告》由会员分享,可在线阅读,更多相关《数据结构平衡二叉树课设报告(24页珍藏版)》请在装配图网上搜索。

1、课程设计报告课程设计名称:数据结构课程设计 课程设计题目:平衡二叉树的构建算法院(系);专业班级学号姓名指导教师装订时:此页为任务书目录第1章 概要设计 71.1题目的内容与要求 71.2总体结构 7第2章 详细设计 82.1主模块 82.2输入模块 92.3平衡化模块 92.4输出模块 11第3章 调试分析 124.1. 遇到的问题: 124.2.收获: 12第4章 使用说明 13参考文献 15附录 15第 1 章 概要设计1.1 题目的内容与要求内容:从键盘输入一个关键字(整数)序列,关键字之间以空格作为 分隔符,然后根据这个序列构建一个平衡二叉树。要求:1. 要求利用二叉链表作为平衡二叉

2、树的存储结构;2. 独立完成系统的设计,编码和调试;3. 系统利用 C 语言实现;4.按照课程设计规范书写课程设计报告。1.2 总体结构本程序主要分为三个模块:输入模块,平衡化模块和输出模块。输入模块: 按题目要求从键盘输入一个关键字(整数)序列,关键字之间以空格作为分隔符。 平衡化模块:当左右子树高度差大于 1 时,对二叉树进行旋转平衡处理。输出模块 根据输入的关键字序列和平衡旋转处理,将平衡二叉树以树状图的形式输出。第 2 章 详细设计2.1 主模块控制整个程序的运行,控制菜单操作,通过主函数模块分别调用各个模块。主模块中提供一个可以输入的选择菜单,通过从键盘输入 1 或 2 来实现各项功

3、能 流程图如图 2.1 所示:2.2 输入模块从键盘输入一个关键字(整数)序列,关键字之间以空格作为分隔符,流 程图如图 2.2 所示。图 2.22.3 平衡化模块当二叉树的左右子树高度差大于 1 时,应该对二叉树进行相应的旋转平衡处理,以维持二叉树平衡,以右平衡旋转处理为例。流程图如图 2.3 所示:hildrc-bfHld-bf开始bf=LHT-bf=EH rc-bf=RHR_RotateL RotateT-bf=LH rc-bf=EHld=rc-lchildT-bf=rc-bf=EHT-bf=rc-bf=Ereturn TL_Rotateld-bf=EHrc=T-rc图 2.32.4 输

4、出模块根据输入的关键字序列和平衡旋转处理,将平衡二叉树以树状图的形式输出,流程图如图 2.4 所示:图 2.4第3章调试分析4.1. 遇到的问题:(1)对平衡二叉树的插入的算法设计程序存在很大问题。插入结点后需要对新的 排序树平衡化,改变结点的信息,使之形成一棵新的平衡二叉树。(2)主函数中的实参和子函数中的实参相等,造成调用该子函数时,虽然没有错 误,但其功能不能正确的实现。改变该变量后程序成功实现各种功能。(3)一些逻辑逻辑运算符书写不正确,造成实现的功能不正确或程序死循环。4.2.收获:(1)对平衡二叉树的构建的算法思想有了更清楚的认识,能够对平衡二叉树进行 创建操作,实现动态的输入数据

5、,实时的输出该树结构。(2)对多个程序的调用。(3)对平衡二叉树的平衡旋转处理有了更深刻的理解。第4章使用说明进入运行界面,如图:选择1,如图:输入一个关键字(整数)序列,以空格作为分隔符,如图:选择y,则继续,如图:参考文献1)算法与数据结构 清华大学出版社 严蔚敏 吴伟民 编著(2)C 语言程序设计清华大学出版社 王敬华 林萍 张清国编著附录#include#include #define LH +1 #define EH 0 #define RH -1 #define NULL 0 typedef struct BSTNode int data;int bf;struct BSTNode

6、 *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);/

7、插入结点 evoid PrintBST(BSTree T,int depth); /按树状打印输出二叉树的元素void CreatBST(BSTree &T)int depth;int e;bool taller=false;T = NULL;printf(n请输入关键字(以0结束建立平衡二叉树):”);scanf(%d,&e);getchar();while(e !=0)InsertAVL(T,e,taller);scanf(%d,&e);getchar();taller=false;depth=0;*J / f f f f -*% 1-1- f 1 1 -*% Tx Tx Tx Tx Tx

8、 Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx -*% 1 11 printf(”您创建的二叉树为5);if(T)PrintBST(T,depth);elseprintf(这是一棵空树!n);void R_Rotate (BSTree &p)对以*p为根的二叉排序树作右旋处理BSTree lc;lc=p-lchild; p-lchild=lc-rchild; l

9、c-rchild=p;p=lc;void L_Rotate (BSTree &p)BSTree rc;rc=p-rchild; p-rchild=rc-lchild;rc-lchild=p;p=rc;void LeftBalance(BSTree &T) 平衡旋转处理BSTree lc,rd;lc=T-lchild;switch(lc-bf)衡处理case LH:要作单右旋处理T-bf=lc-bf=EH;R_Rotate(T);break;lc指向的*p的左子树结点lc的右子树挂接为*p的左子树/p 指向新的根结点对以*p为根的二叉排序树作左旋处理rc指向的*p的右子树根结点rc的左子树挂接为

10、*p的右子树/p 指向新的根结点对以指针T所指结点为根的二叉树作左lc指向*丁的左子树根结点检查*T的左子树的平衡度,并作相应平新结点插入到*T的左孩子的左子树上,新结点插入到*T的左孩子的右子树上,case RH:要作双旋处理rd=lc-rchild;switch(rd-bf)修改*T及其左孩子的平衡因子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;rd-bf=EH;L_Rotate(T-lchild);对*T的左子树作左旋平衡处理R_Rotate(T);对*

11、T作右旋平衡处理void RightBalance(BSTree &T)对以指针T所指结点为根的二叉树作右平衡旋转处理BSTree rc,ld;rc=T-rchild;switch(rc-bf)case RH:T-bf=rc-bf=EH;L_Rotate(T);break;case LH:ld=rc-lchild;switch(ld-bf)case RH:T-bf=LH;rc-bf=EH;break;case EH:T-bf=rc-bf=EH;break;case LH:T-bf=EH;rc-bf=RH;break;ld-bf=EH;R_Rotate(T-rchild);L_Rotate(T)

12、;bool InsertAVL(BSTree &T,int e,bool &taller) /插入结点 eif(!T)T=(BSTree)malloc(sizeof(BSTNode);T-data=e;T-lchild=T-rchild=NULL;T-bf=EH;taller=true;elseif(e=T-data)/树中已存在有相同关键字的结点taller=false;printf(”已存在相同关键字的结点!n);return 0;if(edata)继续在*丁的左子树中进行搜索if(!InsertAVL(T-lchild,e,taller)return 0;if(taller)switch

13、(T-bf)case LH:左平衡处理/未插入检查*T的平衡度/原本左子树比右子树高,需要作LeftBalance(T);taller=false;break;/原本左子树、右子 等高, 现因左case EH:子树增高而使树增高T-bf=LH;taller=true;break;/原本右子树比左子树高,现左、case RH:右子树等高T-bf=EH;taller=false;break;继续在*T的右子树中搜索elseif(!InsertAVL(T-rchild,e,taller)return 0;if(taller)检查*T的平衡度/原本左子树比右子树高,现左、switch(T-bf)cas

14、e LH:右子树等高T-bf=EH;taller=false;break;/原本左子树、右子等高,现因/原本右子树比左子树高,需case EH:右子树增高而使树增高T-bf=RH;taller=true;break;case RH:要作右平衡处理RightBalance(T);taller=false;break;void PrintBST(BSTree T,int depth)int i;if(T-rchild)PrintBST(T-rchild,depth+1);for(i=1;idata);if(T-lchild)PrintBST(T-lchild,depth+1);void main(

15、)BSTree T;int cmd,depth;char ch;bool taller=false;T=(BSTree)malloc(sizeof(BSTNode);T=NULL;printf( *平衡二叉树的操作菜单* n);printf(printf(1-创建 n);2-退出 n);*J / 11 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1* 1

16、* 1* 1* f f -*% 1-1- f 1 1 Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx -*% 1 1 1 doprintf(n请选择操作的编号:);scanf(%d,&cmd);getchar();switch(cmd)case 1:CreatBST(T);break;case 2:printf(” 结束!n);bre

17、ak;default:printf(输入错误!n);printf(n 继续吗? y/n:);scanf(%s,&ch);getchar();printf(n);while(ch=y);printf(n);课程设计总结:通过这次数据结构课程设计,我对平衡一叉树的理解更加深刻,在上机操作 过程中,我遇到很多问题,例如平衡二叉树的平衡旋转处理,二叉树的打印。最 终我通过查阅资料和咨询老师的方法解决了这些问题并成功地运行程序。这次课 程设计不仅让我对函数的调用了解更加清楚,也让我意识到上机实践的重要性, 只有在不断改正自己的错误的过程中吸取经验教训,才能使自己的编程能力得到 提高,这对我未来的工作也会有很大的帮助。与此同时,在这次课程设计中,我也意识到自己C语言基础不够牢固,对 一些基础知识了解不够好,在未来的学习中,我要抓紧时间弥补这方面的不足, 多上机做编程题,这有利于我接下来的学习,也能帮助我以后对计算机方面的专 业知识的理解。指导教师评语:指导教师(签字):年 月日课程设计成绩

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!