- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C二叉树操作问题
VC++课程设计报告
——二叉树操作问题
一、程序功能介绍
带枚举值的二叉树的实现,利用枚举值使二叉树的组成尽量平衡,及左右子树的级数相差不多。可以完成二叉树结点的数据的插入、删除、查找和输出功能。
二、课程设计要求
(1)仔细阅读程序,回答下列问题:
a.枚举值Red和Black在程序中的作用是什么,Red的结点和Black的结点有何区别?
b.一个结点的左右子树最多可以相差几级,为什么?
c.程序是通过那些函数来调整二叉树左右子树的结构,举例说明如何调整。
(2)增加对二叉树上结点中数据进行由大到小排序的函数
(3)增加对二叉树上结点中数据进行由小到大排序的函数
(4)修改main函数,增加菜单选项,使得用户可以通过键盘反复输入命令或数值,查看运行结果。
三、课程设计完成情况
对于要求(1)a.帮助调节左右子树,使左右子树的级数相差不多,且使数据的插入和删除操作较简单。Red的前序必为Black,若有左右子树也必为Black。而Black不作要求。b.最多相差2级。现在考虑级数相差最多的情况,假设当左右子树的级数相同时,在左支的左侧插入一个数据,则相差1级。再在左支结点最多一支插入一个数据,若数据前为黑色,则级数相差2;若为红色,数据插入后调整使得最终级数相差1,再插数若级数变为2,则讨论类似后叙.最后讨论相差2的情况,再在左支末端插入一个数据,由于前后颜色均为红色则调整,调整后级数相差又为2,若仍在左支末端插入数据级数一直相差2,直到相差1,则讨论重复以上。c.通过void RotateLeft(RBnode* x)和 void RotateRight(RBnode* x)调节二叉树左右子树的结构。举例:对于void RotateLeft(RBnode* x),举其中一种普遍情况来说:
对于要求(2)、(3)、(4),通过增加了void up(int *p); void down(int *q); double average();这三个函数完成设计要求。
四、程序运行和分析
(1)void up(int *p)用于数据升序,将main函数中定义的数组首地址传给p。再利用T Max (const T val) 和T Min (const T val)得到最大和最小值,将最小值赋给*p,即给数组中的第一项赋值。然后利用函数T Succ (const T val)找到比数组中的第一项大且最接近的数并赋给数组中第二项。以此类推,直到找到最大值并赋给数组,此时结束程序,而数组中的数据按由小到大排列。(2)void down(int *q)原理同(1),只是先将最大值赋给数组中的第一项,且利用函数T Pred(const T val)寻找较小值。(3)对于求平均值,参考输出二叉树的形状的函数利用递归将所有数遍历一遍,从而求得总和,再除以个数极为平均值。特殊情况:当个数为零是,不能作除法,则单独列出,返回平均值0.
五、源程序
#includeiostream.h
#includefstream.h
#includestdlib.h
#ifndef _RBTREE_H
#define _RBTREE_H
templateclass T
class RBtree
{
public:
enum Color{Red,Black};
private:
class RBnode
{
T value;
Color color;
RBnode *p;
RBnode *left;
RBnode *right;
RBnode():value(0),color(Red),p(NULL),left(NULL),right(NULL){};//缺省构造
RBnode(const T val):value(val),color(Red),p(NULL),left(NULL),right(NULL){};//数据初始化
friend class RBtreeT;//二叉树是其友元类
public:
void Print(int level)//输出
{
for(int i=0;ilevel;++i) // 输出空格对齐用
cout ;
cout|value; // 输出格式|value(color)
if (color==Black)
cout(B);
else
cout(R);
return;
}
};
RBnode *ROOT;
RBnode *NIL;
int alive; // 结点个数
public:
RBtree():ROOT(new RBnode()),NIL(ROOT
您可能关注的文档
最近下载
- 医师访谈记录.pdf VIP
- Unit 4 School Life 第3-4课时Reading and Rriting 课件 中职高一学年英语高教版基础模块1.ppt
- 最新中药饮片质量标准通则(试行).doc VIP
- 医学临床三基(输血学)-输血免疫学基础(精选试题).pptx VIP
- 我们的大脑的教学课件.ppt VIP
- 洞察世间智慧:哲学伴随我成长课件.ppt VIP
- 超星网课《汽车之旅》超星尔雅答案2023章节测验答案.doc VIP
- 老年人继承法培训课件.pptx VIP
- 科学湘科版二年级上册全册课件.pptx
- 第7课全球航路的开辟和欧洲早期殖民扩张【中职专用】《世界历史》(高教版2023基础模块).pptx VIP
文档评论(0)