收藏 分享(赏)

二叉排序树.doc

上传人:kpmy5893 文档编号:9194930 上传时间:2019-07-29 格式:DOC 页数:16 大小:168KB
下载 相关 举报
二叉排序树.doc_第1页
第1页 / 共16页
二叉排序树.doc_第2页
第2页 / 共16页
二叉排序树.doc_第3页
第3页 / 共16页
二叉排序树.doc_第4页
第4页 / 共16页
二叉排序树.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、xx 大学 xx 学院算法与数据结构试验报告设计名称: 算法与数据结构 设计题目: 查找技术综合应用 学生学号: xx 专业班级: xx 学生姓名: xx 学生成绩: 指导教师(职称): 蔡琼(副教授) 课题工作时间: 2012 年 5 月 24 日 说明:实验课程类别:课程内实验实验课程性质:必修适用专业、年级:2010 级计算机工程、计算机网络开课院、系:计算机科学与工程学院计算机工程教研室学时:18编写依据:算法与数据结构实验教学大纲修订时间:2012 年 2 月算法与数据结构课程实验指导书(以下简称:指导书)是针对计算机学院所开设的对应课程的上机实验而编写的教学文件,供学生上机实验时使

2、用。上机的工作环境要求:Windows 2000 或以上操作系统、VC+ 6.0 或者其它高级程序设计语言。学生应按指导教师的要求独立完成实验,并按要求撰写实验报告。每一个实验,编程上机调试并且提交电子文档实验报告,以学号姓名作为文件名上传。报告内容至少包含如下内容:1、 学生基本情况:专业班级、学号、姓名2、 实验题目、实验内容3、 设计分析4、 源程序代码5、 测试用例(尽量覆盖所有分支)6、 实验总结一实验内容与学时分配序次实验题目实验类型 基本技能训练学时一 线性结构综合应用 综合性(1)掌握线性结构的常用操作;(2)能够应用线性结构解决比较简单的问题。 10二 非线性结构综合应 用

3、综合性(1)掌握树形、图形结构的插入、删除、查找等算法;(2)能够应用二叉树解决比较简单的问题。4三 查找技术综合应用 综合性(1)熟练掌握查找的常用算法;(2)熟练设计和应用查找算法解决简单的实际问题。 2四 排序技术综合应用 综合性(1)熟练掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;(2)深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;(3)了解各种方法的排序过程及其依据的原则,并掌2握各种排序方法的时间复杂度的分析方法。一、试验课题查找技术综合应用实验目的:(1)熟练掌握查找的常用算法;(2)熟练设计和应用查找算法解决比较简单的实际问题。二、试验内容实验内容:二叉

4、排序树。任意给定一组数据,设计一个算法,建立一棵二叉排序树,对它进行查找、插入、删除等操作。三、试验分析在实验说明:二叉排序树存储结构如下:typedef struct BiTNode / 结点结构struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;二叉排序树插入算法伪代码如下:二叉排序树中删除一个结点 f 的左孩子结点 p 算法伪代码如下:四、源程序代码#include#include1. 若 root 是空树,则将结点 s 作为根结点插入;否则2. 若 s-dataroot -data,则把结点 s 插入到 root 的左子

5、树中;否则3. 把结点 s 插入到 root 的右子树中。1. 若结点 p 是叶子,则直接删除结点 p;2. 若结点 p 只有左子树,则只需重接 p 的左子树;若结点 p 只有右子树,则只需重接 p 的右子树; 3. 若结点 p 的左右子树均不空,则3.1 查找结点 p 的右子树上的最左下结点 s 以及结点 s 的双亲结点 par;3.2 将结点 s 数据域替换到被删结点 p 的数据域;3.3 若结点 p 的右孩子无左子树,则将 s 的右子树接到 par 的右子树上;否则,将 s 的右子树接到结点 par 的左子树上;3.4 删除结点 s;#include#define Max 100type

6、def int KeyType;typedef struct nodeKeyType key;struct node *lchild,*rchild;BSTNode;int InsertBST(BSTNode *p-key=k;p-lchild=p-rchild=NULL;return 1;else if(k=p-key)return 0;else if(kkey)return InsertBST(p-lchild,k);elsereturn InsertBST(p-rchild,k);BSTNode *CreateBST(KeyType A,int n) /创建二叉排序树BSTNode *b

7、t=NULL;int i=0;while(ikey=k)return bt;if(kkey)return SearchBST(bt-lchild,k);elsereturn SearchBST(bt-rchild,k);void charu(BSTNode *printf(“请输入你要插入的元素:“);scanf(“%d“,InsertBST(bt,n);void chazhao(BSTNode *bt)system(“cls“);/清屏int k;BSTNode *a;printf(“请输入要查找的元素:“);scanf(“%d“,a=SearchBST(bt,k);if(a!=NULL)p

8、rintf(“找到了元素%dn“,k);elseprintf(“找不到该元素n“);void shuru(BSTNode */清屏int m,aMax=0,i;printf(“请输入二叉排序树中元素的个数:n“);scanf(“%d“,n=m;for(i=0;ilchild);printf(“%d “,b-key);print1(b-rchild);void print(BSTNode *b)system(“cls“);/清屏print1(b);int DeleteBST(BSTNode *p=T; /从根结点开始查找 pParent= NULL;/ T的双亲为 NULLwhile (p)/

9、开始查找关键字为 x的结点 p,及双亲 pParentif (x = p-key)break;pParent = p;p = x p-key ? p-rchild : p-lchild; if (p=NULL)printf(“要删除的结点不存在n“);return 0; / 至此已找到目标结点 p/ pChileNode = p存在的孩子或 NULL,左右都存在时,取左pChileNode = p-lchild!= NULL ? p-lchild : p-rchild;if(p-lchild=NULL|p-lchild=NULL)if (pParent = NULL) T= pChileNod

10、e; else if(p=pParent-lchild) pParent-lchild= pChileNode; else pParent-rchild = pChileNode; free(p);/释放空间 / 当 2个孩子都存在时else/pChileNode已指向 p-lchildq=p;while (pChileNode-rchild) /在 p的左字树中查找中序 p的前驱 pChileNode,q 为其双亲q=pChileNode;pChileNode = pChileNode-rchild; p-key=pChileNode-key;/p的前驱 pChileNodede 的关键值赋

11、给 pif(q!=p) /将删除 p转化为删除 pChileNodede(最多只有左子树)结点q-rchild=pChileNode-lchild;/p的左子树有右孩子else q-lchild=pChileNode-lchild;/p的左子树有右孩子free(pChileNode);return 1; void shanchu(BSTNode */清屏int k,i;printf(“请输入你要查找的元素“);scanf(“%d“,i=DeleteBST(bt,k);if(i=0)printf(“删除不成功!n“);elseprintf(“删除成功!n“);void menu()system(

12、“cls“);/清屏printf(“n*菜单*nn“);char a50=“1.输入二叉排序树“;char b50=“2.查找“;char c50=“3.删除“;char d50=“4.插入“;char e50=“5.显示“;char f50=“6.退出“;printf(“t%-35s%-35snnt%-35s%-35snnt%-35s%-35snn“,a,b,c,d,e,f);printf(“*n“);printf(“请选择你要执行的操作对应的序号:n“);void main()int n,aMax=0;printf(“-二叉排序树-nn“);printf(“t本程序可以实现对一组数据进行查

13、找、插入、删除等操作。nn“);BSTNode *e=NULL;for(;)/*无限循环*/ printf(“按任意键进入主菜单。“);getch();menu(); /*显示菜单*/int i=100; /*初始化*/fflush(stdin);/*清空输入缓冲区*/scanf(“%d“,if(i=0break; /*输入记录*/ case 2:chazhao(e);break;case 3:shanchu(e);break; case 4:charu(e);break; case 5:print(e);break; case 6:exit(0); /*退出*/elseprintf(“不要乱按!n“);五、测试用例1.进入主程序,有如下提醒:2.主菜单3.选择 1,输入二叉排序树,如下:4.到主菜单里面选择 4,把二叉排序树进行显示,由于算法采用的是线序遍历,所以出来的序列是从小到大的顺序的:5.下面验证查找:6.验证删除:7.再显示:8.反过来验证查找:9.验证插入:10.显示:11.选择退出程序:六、试验总结通过本次上机实验,熟练掌握查找的常用算法,并且掌握了如何通过二叉排序树对一组元素进行存储、操作,实现查找、删除、插入等操作。又认识了一种新的组织数据的方式,也对查找有了新的认识,可以通过二叉排序树的形式来实现.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报