利用二叉树结构查找数据元素.docx
- 文档编号:8585219
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:13
- 大小:124.78KB
利用二叉树结构查找数据元素.docx
《利用二叉树结构查找数据元素.docx》由会员分享,可在线阅读,更多相关《利用二叉树结构查找数据元素.docx(13页珍藏版)》请在冰豆网上搜索。
利用二叉树结构查找数据元素
课程设计报告
课程名称数据结构课程设计
专业班级
姓名
学号
指导教师
起止时间2014.2.25~2014.2.28
成绩评定
考核
内容
设计
表现
设计
报告
答辩
综合
评定
成绩
计算机技术与工程学院
课程设计考核和成绩评定办法
1.课程设计的考核由指导教师根据设计表现、设计报告、设计成果、答辩等几个方面,给出各项权重,综合评定。
该设计考核教研室主任审核,主管院长审批备案。
2.成绩评定采用五级分制,即优、良、中、及格、不及格。
3.参加本次设计时间不足三分之二或旷课四天以上者,不得参加本次考核,按不及格处理。
4.课程设计结束一周内,指导教师提交成绩和设计总结。
5.设计过程考核和成绩在教师手册中有记载。
课程设计报告内容
课程设计报告内容、格式各专业根据专业不同统一规范,经教研室主任审核、主管院长审批备案。
注:
1.课程设计任务书和指导书在课程设计前发给学生,设计任务书放置在设计报告封面后和正文目录前。
2.为了节省纸张,保护环境,便于保管实习报告,统一采用A4纸,实习报告建议双面打印(正文采用宋体五号字)或手写。
一、课程设计目的
《数据结构》是计算机专业的专业基础课,是一门实践性很强的课程,学生通过理论学习,并在完成每章后面的一些小程序后,理解了数据结构的基本概念,掌握了一些基本的编程技术,但仅有这一方面的训练还是很不够的。
全面、严格的训练,是学好该课程的一个不可缺少的组成部分。
课程设计对于提高学生用学到的书本知识解决实际问题,培养实际工作所需要的动手能力,对于提高以科学理论和工程上的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用。
通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计要求
《数据结构课程设计》则要培养、训练学生选用合适的数据结构并运用程序设计语言(C/C++)编写质量高的应用程序。
并建立初步评价算法程序的能力。
为编译技术、操作系统、数据库及算法设计与分析等后继课程的学习以及为应用软件特别是非数值应用软件的开发打下良好的理论基础和实践基础
重点和难点:
1.针对具体问题如何选择或设计合适的数据结构;
2.如何根据一定的存储策略实现数据的存储表示;
3.基于上述数据结构设计并实现完成具体要求的算法;
4.对算法的时间性能进行分析。
针对每一个设计题目写出
1.问题分析和任务定义:
根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?
(而不是怎么做?
)限制条件是什么?
2.逻辑设计:
对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;
3.详细设计:
定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;
4.程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
同时加入一些注解和断言,使程序中逻辑概念清楚;
5.程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
三、具体设计题目
1.问题描述
利用二叉树结构查找数据元素
设计目的:
用《数据结构》中的二叉链表作数据结构,结合语言基本知识。
编写一个二叉树结构存储软件。
以把所学数据结构知识应用到实际软件开发中去。
设计内容:
本系统应完成一下几方面的功能:
创建二叉树二叉链表存储——Creat();
实现数据的添加——二次调用Creat();
实现数据的删除——Delete();
统计出给定二叉树中叶子结点的数目——Countleaf();
设计要求:
二叉连表存储的创建需要一次前序中序或后序遍历来体现
作为一个完整的系统,应具有友好的界面和较强的容错能力
上机能正常运行,并写出课程设计报告
2.问题分析和任务定义
该题是要求通过巩固双链表,在所学C++语言基础上用其设计二叉链表存储,包括二叉树二叉链表的创建,实现数据的添加,实现数据的删除,统计出给定二叉树中叶子结点的数目。
限制条件是要有较好的界面和较强的容错能力而且上机能正常运行。
3.逻辑设计
设计该题需要一个结构体类型,包括创建二叉链表并对其进行遍历操作以及对其的插入删除和统计叶子数目的操作该系统包括Creat模块,Release模块,PreOrder模块,InOrder模块,PostOrder模块,Delete模块,Countleaf模块,menu模块。
模块之间调用关系如下图所示:
4.详细设计
1)创建二叉链表的伪代码描述如下
建立双链表空头结点*bt;
判断是否为空:
空的结点用”#”代替
递归输入左右孩子
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
空的结点用”#”代替
代码部分
BiNode*BiTree:
:
Creat(BiNode*bt)//构造二叉链表存储
{
charch;
cin>>ch;
if(ch=='#')bt=NULL;
else{
bt=newBiNode;
bt->data=ch;
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
}
returnbt;
}
2)实现数据的添加的伪代码描述如下:
二次调用创建函数Creat();
3)实现数据的删除的伪代码描述如下:
待删除结点初始化cin>>x;
在链表中查找x元素位置并删除
if(bt!
=NULL){
if(bt->data==x){
if(p==NULL)bt=NULL;
elseif(p->lchild==bt)p->lchild=NULL;
elsep->rchild=NULL;
}
else{
p=bt;
Delete(bt->lchild,x);
Delete(bt->rchild,x);
}
}
4)统计出给定二叉树中叶子结点的数目的伪代码描述如下:
递增计数静态变量y初始化
递归计数叶子结点数目
if(!
bt->lchild&&!
bt->rchild)
y++;
Countleaf(bt->lchild);
Countleaf(bt->rchild);
5.流程图
6.程序源代码如下:
#include
//#include
intcount;
structBiNode
{
chardata;
BiNode*lchild,*rchild;
};
classBiTree
{
public:
intcuont;
BiTree(){root=Creat(root);}
~BiTree(){Release(root);}
voidPreOrder(){PreOrder(root);}
voidInOrder(){InOrder(root);}
voidPostOrder(){PostOrder(root);}
voidDelete(){Delete(root,x);}
voidCountleaf(){Countleaf(root);}
voidDelete(BiNode*bt,charx);
private:
charx;
BiNode*root,*p;
BiNode*Creat(BiNode*bt);
voidRelease(BiNode*bt);
voidPreOrder(BiNode*bt);
voidInOrder(BiNode*bt);
voidPostOrder(BiNode*bt);
voidDelete(BiNode*bt,charx);
voidCountleaf(BiNode*bt);
};
BiNode*BiTree:
:
Creat(BiNode*bt)//构造二叉链表村储
{
charch;
cin>>ch;
if(ch=='#')bt=NULL;
else{
bt=newBiNode;
bt->data=ch;
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
}
returnbt;
}
voidBiTree:
:
Release(BiNode*bt)
{
if(bt!
=NULL){
Release(bt->lchild);
Release(bt->rchild);
deletebt;
}
}
voidBiTree:
:
PreOrder(BiNode*bt)
{
if(bt==NULL)return;
else{
cout<
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
voidBiTree:
:
InOrder(BiNode*bt)
{
if(bt==NULL)return;
else{
InOrder(bt->lchild);
cout<
InOrder(bt->rchild);
}
}
voidBiTree:
:
PostOrder(BiNode*bt)
{
if(bt==NULL)return;
else{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<
}
}
voidBiTree:
:
Delete(BiNode*bt,charx)//删除值为x的结点
{
if(bt!
=NULL){
if(bt->data==x){
if(p==NULL)bt=NULL;
elseif(p->lchild==bt)p->lchild=NULL;
elsep->rchild=NULL;
}
else{
p=bt;
Delete(bt->lchild,x);
Delete(bt->rchild,x);
}
}
}
voidBiTree:
:
Countleaf(BiNode*bt)//叶子
{staticinty;
if(bt==NULL)return;
else{
if(!
bt->lchild&&!
bt->rchild)
y++;
Countleaf(bt->lchild);
Countleaf(bt->rchild);
count=y;
}
}
voidmenu()
{
BiNode*r;
cout<<"构造一颗二叉树:
"< BiTreeb; intt; cout<<"1.为二叉树的前序遍历"< cout<<"2.为二叉树的中序遍历"< cout<<"3.为二叉树的后序遍历"< cout<<"4.为统计叶子结点总数"< cout<<"5.为二叉树的删除操作"< cout<<"6.为二叉树的添加操作"< cout<<"请输入操作编号: "; cin>>t; switch(t) { case1: b.PreOrder();cout< case2: b.InOrder();cout< case3: b.PostOrder();cout< case4: b.Countleaf();cout< case5: cout<<"请输入要删除的结点: "< case6: cout<<"请输入要添加的结点: "< } } voidmain() { //system("color7E"); cout<<">>>>软件124215号黄抗抗<<<<"< menu(); } 7.程序运行结果如下: (1)构造并前序遍历二叉树 (2)统计叶子结点数目 (3)删除叶子结点 (4)添加操作 四、总结: 通过这次的实验,我认识到: 仅仅掌握课本上的知识是不够的,在实际操作时,常常遇到一些问题,自己看不懂,更无法解决。 不过,经过自己不断的思考,尝试着去更改代码中出现的问题。 虽然开始很困难,但在老师和同学的帮助下,我逐渐的熟悉了许多操作,为后继工作的顺利进行做了准备。 个人的力量是薄弱的,我学会了咨询别人,不再胆怯,不再保守。 在过程中和同学相互讨论,询问老师,不断进步。 也许,我们可以说,编一个程仅仅是开始,调试和运行相比之下更难。 实践中收获的远比想象的多。 看到自己完成了所要求的任务,有一种无法用言语来形容的欣慰之感,这也是无法从学习书本知识中得到的。 参考文献: [1]王红梅,胡明,王涛编著.数据结构(C++版).北京.清华大学出版社,2012 [2]李爱华程磊编著.面向对象程序设计C++.清华大学出版社 [3]谭浩强编著.C语言程序设计(第二版).清华大学出版社 [4]XX文库.二叉排序树相关算法的排序 [5]豆丁网.二叉排序树的实现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 二叉 结构 查找 数据 元素