数据结构课设.docx
- 文档编号:11924667
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:32
- 大小:34.47KB
数据结构课设.docx
《数据结构课设.docx》由会员分享,可在线阅读,更多相关《数据结构课设.docx(32页珍藏版)》请在冰豆网上搜索。
数据结构课设
课程设计报告
排序二叉树
完成日期:
2015/01/03
一、需求分析
1.运行环境;
程序所实现的功能;2.
程序的输入:
3.
程序的输出:
4.测试数据,5.合作人及其分工6.二、设计说明
1.算法设计的思想;
主要的数据结构设计说明;2.程序的主要流程图;3.
程序的主要模块,;4.
程序的主要函数及其伪代码说明.5.合作人设计分工。
6.
三、上机结果及体会
1.合作人编码分工;
实际完成的情况说明;2.程序的性能分析;3.
打印程序运行时的初值和运行结果,画出相应的图示;4.上机过程中出现的问题及其解决方案;5.
程序中可以改进的地方说明;6.
收获及体会;7.源程序清单并附上注释。
8.
四、参考文献
需求分析一、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
(r!
=NULL)q.EnQueue(r);
if
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
(1)O(log2n)-O((n+1)/2)查找O
(1)插入O(log2n)
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;
}
};
ElemType>template : public Node LinkQueue(); ~LinkQueue();virtual IsEmpty(); boolDelQueue(ElemType&e);void ElemTypee);voidEnQueue(const}; template boolLinkQueue : IsEmpty() { if(front==rear) returntrue; else ;falsereturn } ElemType> class : LinkQueue() { Node ElemType> template : ~LinkQueue() { } ElemType> : EnQueue(ElemTypee)void { Node Node (p){ifrear->next=p; rear=rear->next; } } ElemType> : DelQueue(ElemType&e)void{ (! IsEmpty()){ifNode e=p->data; front->next=p->next; (rear==p)if rear=front; p;delete } } ElemType> ElemTypedata; BinTreeNode BinTreeNode BinTreeNode(); BinTreeNode(ElemType&e); }; template BinTreeNode : BinTreeNode(ElemType&e) { data=e; leftChild=NULL; rightChild=NULL; } ElemType> template BinTreeNode : BinTreeNode() { leftChild=NULL; rightChild=NULL; } ElemType>classtemplate : publicBinTreeNode BinarySortTree(); //显示这个数);voiddesplayTree(void//在树中插入一个节点boolinsertTree(ElemType&e); ~BinarySortTree();virtualBinTreeNode PreOrder(BinTreeNode InOrder(BinTreeNode PostOrder(BinTreeNode LevelOrderTree();void BinTreeNode DeleteTree(BinTreeNode void; const&key,BinTreeNode destroyTree(BinTreeNode void }; template BinarySortTree : BinarySortTree() { r=NULL; } ElemType> classtemplate<节点new//调用析构函数,运用递归删除所有的BinarySortTree : ~BinarySortTree() { < ? ℡? 一? 棵已? 经-消? 除y了cout< } template boolBinarySortTree : DeleteTree(BinTreeNode ElemType>*&fq) { 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; } } //(p->leftChild==NULL)有右子树结点elseif{ (fq==NULL)if{ r=p->rightChild;} (fq->leftChild==p) elseif fq->leftChild=p->rightChild; fq->rightChild=p->rightChild;elsep;delete p=NULL; } 有左子树结点//(p->rightChild==NULL)elseif{ (fq==NULL)if { r=p->leftChild;} (fq->leftChild==p)if 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; (tmpF->rightChild==tmpPtr)if DeleteTree(tmpF->rightChild,tmpF); elseDeleteTree(tmpF->leftChild,tmpF); } ; truereturn} template voidBinarySortTree : ExchangeTree(BinTreeNode { BinTreeNode if(head->leftChild==NULL&&head->rightChild==NULL) return; { else temp=head->leftChild; head->leftChild=head->rightChild; head->rightChild=temp; } (head->leftChild)ifExchangeTree(head->leftChild); (head->rightChild) if ExchangeTree(head->rightChild); } ElemType> : FindTree(ElemType &key,BinTreeNode BinTreeNode f=NULL;//指向p的双亲 while(p! =NULL&&p->data! =key) {//查找关键字为key的节点 i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构
![提示](https://static.bdocx.com/images/bang_tan.gif)