数据结构课设.docx
- 文档编号:27129500
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:31
- 大小:262.46KB
数据结构课设.docx
《数据结构课设.docx》由会员分享,可在线阅读,更多相关《数据结构课设.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课设
课程设计报告
排序二叉树
完成日期:
2015/01/03
一、需求分析
1.运行环境;
2.程序所实现的功能;
3.程序的输入:
4.程序的输出:
5.测试数据,
6.合作人及其分工
二、设计说明
1.算法设计的思想;
2.主要的数据结构设计说明;
3.程序的主要流程图;
4.程序的主要模块,;
5.程序的主要函数及其伪代码说明.
6.合作人设计分工。
三、上机结果及体会
1.合作人编码分工;
2.实际完成的情况说明;
3.程序的性能分析;
4.打印程序运行时的初值和运行结果,画出相应的图示;
5.上机过程中出现的问题及其解决方案;
6.程序中可以改进的地方说明;
7.收获及体会;
8.源程序清单并附上注释。
四、参考文献
1、需求分析
1.运行环境
a软件环境
操作系统:
windows7编译器microsoftvisualstudio2010
b硬件环境
联想n480
2.程序所实现的功能
1.创建二叉树:
(1)按提示信息输入一组关键字值,并建立相应的二叉排序树。
(2)按照先序遍历方式显示建立的二叉排序树。
(3)按照中序遍历方式显示建立的二叉排序树。
(4)按照后序遍历方式显示建立的二叉排序树。
2.显示二叉排序树:
(1)按照先序遍历方式显示二叉排序树。
(2)按照中序遍历方式显示二叉排序树。
(3)按照后序遍历方式显示二叉排序树。
(4)按照层次遍历方式显示二叉排序树。
3.删除一个结点:
要求可以实现删除根结点、叶子结点以及其它任意结点的功能。
(1)按照先序、中序、后序方式显示删除前的二叉排序树。
(2)按提示信息输入被删除结点的值,并在二叉排序树进行删除。
(3)显示删除是否成功的结果。
(4)若删除成功,则按照先序、中序、后序方式显示删除后的二叉排序树。
4.插入一个结点:
(1)按照先序、中序、后序方式显示插入前的二叉排序树。
(2)按提示信息输入要插入结点的值,并在二叉排序树进行插入。
(3)显示插入是否成功的结果。
(4)若插入成功,则按照先序、中序、后序方式显示插入后的二叉排序树。
5.查找给定值的结点:
(1)按照先序、中序、后序方式显示二叉排序树。
(2)按提示信息输入待查找的值,并在二叉排序树进行查找。
(3)显示查找是否成功的结果。
6.交换二叉排序树:
(1)按照先序、中序、后序方式显示初始的二叉排序树。
(2)按照先序、中序、后序方式显示交换左右子树后的二叉排序树。
7.退出:
退出整个算法演示程序。
3.程序的输入:
输入为整形数据,输入一串数字序列并以-1结束,且以回车键相隔。
4.程序的输出:
通过用户手动选择操作指令,经由程序内部处理,输出相应的结果到显示屏。
5.测试数据,
用户手动输入一个数字序列进行数据测试
二、设计说明
1算法设计的思想
根据算法的需求,确定算法的主要模块(建立二叉树、显示二叉树,插入结点、删除结点、查找结点、退出系统。
以及主函数模块)对各模块再进行函数的选取与构造,以及变量的控制等。
最后,再将各模块结合,形成完整的算法,由主函数来调用。
并设计界面。
程序运行时在界面上显示及选择。
注意全局变量的选择。
2主要的数据结构设计说明;
设计了一个排序二叉树的数据结构,包括查找,删除等功能。
首先使用类模板建立排序二叉树类,及结点类存储结构。
因显示函数中的层次遍历需要用到队列,所以定义了一个链式队列类,二叉树函数成员中包括查找,删除,显示,插入函数。
下面分别写出几个函数的代码。
主函数部分包括一个主函数和一个界面模块。
主函数调用部分1.建立二叉树即循环调用插入函数。
并调用遍历函数,2.遍历显示,调用遍历函数。
3.删除,首先由查找函数查找到关键字的地址,再传递给删除函数,进行删除。
4.插入,插入前,插入后分别调用遍历函数并且调用插入函数即可,插入函数中,调用了查找函数。
5.查找,调用查找函数,并显示查找结果,成功或者失败。
6.退出系统,整个主函数循环选择功能序号的条件是number不等于6。
7.交换功能
3.程序的主要流程图;
4.程序的主要模块,要求对主要流程图中出现的模块进行说明;
a.创建二叉树:
循环条件调用插入函数。
b.显示二叉排序树:
调用desplayTree函数,desplayTree函数调用先中后序遍历。
调用层次遍历函数。
c.删除一个结点:
首先由查找函数查找到关键字的地址,再传递给删除函数,进行删除。
并在删除前后显示遍历结果。
d.插入一个结点:
插入前,插入后分别调用遍历函数并且调用插入函数即可,插入函数中,调用了查找函数。
e.查找给定值的结点:
查找,调用查找函数,并显示查找结果,成功或者失败。
f.交换二叉排序树:
g.退出:
5.程序的主要函数及其伪代码说明
a.删除函数
P定义为叶结点p->leftChild==NULL&&p->rightChild==NULL
如果p的左孩子右孩子均为空deletep;直接删除p
elseif(p->leftChild==NULL)
tmpPtr=p;
p=p->rightChild;
deletetmpPtr;
如果被删除的元素只有右子树,没有左子树,则可以拿他的左孩子顶替他的位置,再释放该元素的存储空间即可;只有左子树没有右子树同理。
tmpF=p;
tmpPtr=p->leftChild;
while(tmPtr->rightChild!
=NULL){
//查找p在中序序列中直接前驱tmpPtr及其双亲tmpF
tmpF=tmpPtr;
tmpPtr=tmpPtr->rightChild;
}
p->data=tmpPtr->data;
//将tmpPtr指向结点的数据元素值赋值给被删除的结点
if(tmpF->rightChild==tmpPtr)//删除tmpPtr的结点
Delete(tmpF->rightChild);
else
Delete(tmpF->rightChild);
else
Delete(tmpF->leftChild);
如果被删除的元素左右孩子都存在的话,则在他的左子树中寻找关键字值最大的数据元素x,用x的值代替被删除元素的值,再来删除数据元素的值x。
b.交换函数
(head->leftChild==NULL&&head->rightChild==NULL)如果左右孩子均为空,则不需要交换。
temp=head->leftChild;
head->leftChild=head->rightChild;
head->rightChild=temp;
如果不为空,则定义中间变量,进行左右交换。
if(head->leftChild)
ExchangeTree(head->leftChild);
如果被交换的结点存在树的左子树上则递归递归调用交换函数。
存在于右子树上同理。
c.查找函数
BinTreeNode
从根节点开始将根节点的关键字与给定值比较如果相同则成功。
if(key
{f=p;
p=p->leftChild;
}
else
{f=p;
p=p->rightChild;
f=NULL;
如果给定值小于根节点的关键字,则在根节点的左子树上递归查找。
大于则在右子树上递归查找。
d.插入函数
(FindTree(e,f)==NULL)
首先查找给定值是否在书中已存在。
if(f==NULL)r=p;
如果为空树,则新节点为根节点。
elseif(e
elsef->rightChild=p;
如果小于双亲,则插入结点为左孩子。
大于双亲,则插入结点为右孩子。
returntrue;
else
returnfalse;
如果查找成功,则插入失败。
e.先中后以及层次遍历函数
voidBinarySortTree
:
desplayTree()
由该函树调用先中后序遍历,以先序遍历为例。
if(r!
=NULL){
cout<
PreOrder(r->leftChild);
PreOrder(r->rightChild);
如果以r为跟的二叉树为空,则遍历结束,如不为空,首先访问根节点再先序遍历他的左子树。
然后再先序遍历它的右子树。
中序,首先中序遍历他的左子树,再访问他的根节点,最后中序遍历它的右子树。
后序首先后序遍历他的左子树,再后序遍历它的右子树,最后访问根节点。
层次遍历
LinkQueue
BinTreeNode
if(r!
=NULL)q.EnQueue(r);
while(!
q.IsEmpty())
{
q.DelQueue(w);
cout<
if(w->leftChild!
=NULL)
q.EnQueue(w->leftChild);
if(w->rightChild!
=NULL)
q.EnQueue(w->rightChild);
1.首先初始化队列,并将根节点入队。
2.当队列非空时,取出队头结点转3否则结束遍历。
3.访问结点p如果该节点有左孩子则将其左孩子入队;如果该节点有右孩子,则将其右孩子入队。
4.重复步骤23直到队列为空为止。
6.合作人设计分工
经由郭凯迪同学指错改错。
三、上机结果及体会
1.实际完成的情况说明
所要求的功能均能实现,数据类型为整形数据
2.程序的性能分析,包括时空分析
函数
时间复杂度
空间复杂度
查找
O(log2n)-O((n+1)/2)
O
(1)
插入
O(log2n)
O
(1)
删除
O
(1)
O
(1)
先中后遍历
O(n)
O(n)
层次遍历
O(n)
O(n)
交换
O
(1)
O
(1)
3.打印程序运行时的初值和运行结果
A.初始界面
B.建树
C.显示
D.删除
E.查找
F.交换
G.退出
H.插入
4.上机过程中出现的问题及其解决方案
出现许多语法问题例如定义函数与声明不匹配,函数名称是否正确,ifelse的匹配问题,通过一步一步的修改最终实现程序。
界面部分修改的更合理。
创建函数部分,循环调用插入函数时输入是在调用前还是在调用后。
删除函数部分首先需要查找关键字结点,查找返回的为地址,所以中间传递变量应为指针,以及参数数量应相等。
5.程序中可以改进的地方说明
界面可以进行进一步优化。
6.收获及体会
a.进行程序设计的时候注意模块的划分,从各个小模块开始进行设计
b.熟练掌握各函数的成员构成
c.交流与合作
7.打印一份源程序清单并附上注释。
#include
#include
#include
#include
template
structNode
{
ElemTypedata;
Node
Node(ElemType&e)
{
data=e;
next=NULL;
};
Node()
{
next=NULL;
}
};
template
classLinkQueue
{
public:
Node
LinkQueue();
virtual~LinkQueue();
boolIsEmpty();
voidDelQueue(ElemType&e);
voidEnQueue(constElemTypee);
};
template
boolLinkQueue
:
IsEmpty()
{
if(front==rear)
returntrue;
else
returnfalse;
}
template
LinkQueue
:
LinkQueue()
{
rear=front=newNode
}
template
LinkQueue
:
~LinkQueue()
{
}
template
voidLinkQueue
:
EnQueue(ElemTypee)
{
Node
p=newNode
if(p){
rear->next=p;
rear=rear->next;
}
}
template
voidLinkQueue
:
DelQueue(ElemType&e)
{
if(!
IsEmpty()){
Node
e=p->data;
front->next=p->next;
if(rear==p)
rear=front;
deletep;
}
}
template
structBinTreeNode//声明树结构
{
ElemTypedata;
BinTreeNode
BinTreeNode
BinTreeNode();
BinTreeNode(ElemType&e);
};
template
BinTreeNode
:
BinTreeNode(ElemType&e)
{
data=e;
leftChild=NULL;
rightChild=NULL;
}
template
BinTreeNode
:
BinTreeNode()
{
leftChild=NULL;
rightChild=NULL;
}
template
classBinarySortTree
{
public:
BinTreeNode
BinarySortTree();
voiddesplayTree(void);//显示这个数
boolinsertTree(ElemType&e);//在树中插入一个节点
virtual~BinarySortTree();
BinTreeNode
voidPreOrder(BinTreeNode
voidInOrder(BinTreeNode
voidPostOrder(BinTreeNode
voidLevelOrderTree();
BinTreeNode
boolDeleteTree(BinTreeNode
voidExchangeTree(BinTreeNode
BinTreeNode
voiddestroyTree(BinTreeNode
};
template
BinarySortTree
:
BinarySortTree()
{
r=NULL;
}
template
BinarySortTree
:
~BinarySortTree()//调用析构函数,运用递归删除所有的new节点{
cout<<"已?
经-消?
除y了?
一?
棵?
树骸?
!
!
!
"< destroyTree(r); } template boolBinarySortTree : DeleteTree(BinTreeNode { BinTreeNode if(p->leftChild==NULL&&p->rightChild==NULL&&fq! =NULL)//叶子结点? { deletep; if(fq! =NULL) { if(fq->leftChild==p) fq->leftChild=NULL; elsefq->rightChild=NULL; p=NULL; } } elseif(p->leftChild==NULL)//有右子树结点 { if(fq==NULL) { r=p->rightChild;} elseif(fq->leftChild==p) fq->leftChild=p->rightChild; elsefq->rightChild=p->rightChild; deletep; p=NULL; } elseif(p->rightChild==NULL)//有左子树结点 { if(fq==NULL) { r=p->leftChild;} if(fq->leftChild==p) fq->leftChild=p->leftChild; elsefq->rightChild=p->leftChild; deletep; p=NULL; } else//左右子树都有 { tmpF=p; tmpPtr=p->leftChild; while(tmpPtr->rightChild! =NULL)//找左子树的右子树最后一个结点循环结束tmpPtr指向目标结点,tmpF指向目标结点的父母. { tmpF=tmpPtr; tmpPtr=tmpPtr->rightChild; } p->data=tmpPtr->data; if(tmpF->rightChild==tmpPtr) DeleteTree(tmpF->rightChild,tmpF); else DeleteTree(tmpF->leftChild,tmpF); } returntrue; } template voidBinarySortTree : ExchangeTree(BinTreeNode { BinTreeNode if(head->leftChild==NULL&&head->rightChild==NULL) return; else{ temp=head->leftChild; head->leftChild=head->rightChild; head->rightChild=temp; } if(head->leftChild) ExchangeTree(head->leftChild); if(head->rightChild) ExchangeTree(head->rightChild); } template BinTreeNode : FindTree(ElemType&key,BinTreeNode { BinTreeNode f=NULL;//指向p的双亲 while(p! =NULL&&p->data! =key) {//查找关键字为key的节点 if(key {//key比p的值小,则在p的左子树上进行查找 f=p; p=p->leftChild; } else {//key比p的值大,则在p的右子树上进行查找 f=p; p=p->rightChild; } } returnp; } template boolBinarySortTree : insertTree(ElemType&e) { //f=NULL;//指向被查找节点的双亲 BinTreeNode BinTreeNode if(FindTree(e,f)==NULL){//查找失败,插入成功。 p=newBinTreeNode if(f==NULL)//空二叉树,新节点为根节点 r=p; elseif(e f->leftChild=p; else//e大于其双亲,插入结点为f的右孩子 f->rightChild=p;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构