数据结构 创建二叉排序树与查找
更新时间:2024-01-28 11:25:01 阅读量: 教育文库 文档下载
- 数据结构与算法推荐度:
- 相关推荐
《数据结构》实验报告
◎实验题目:创建二叉排序树与查找
◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法;
2、掌握二叉排序树的创建和二叉排序树查找的方法。
3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。
◎实验内容:建立至少10个顶点的二叉排序树,然后对其进行中序遍历,接着进行查找, 判断待查找数据是否存在。 一、需求分析
1、输入的形式和输入值的范围:根据提示,首先输入顶点中的数据,在进行查找操作时,输入待查找的数据,接着选择下一步要进行的操作(A.新二叉排序树;B.继续查找;C.结束操作)。
2、输出的形式:输出二叉排序的中序遍历结果,在输入待查找的数据后,输出查找的结果。 3、程序所能达到的功能:输入顶点数据后,创建二叉排序树,接着进行中序遍历,再输入待查找数据进行查找操作。 4、测试数据:
请输入顶点数据:53 25 76 20 48 14 60 84 33 78 中序遍历结果为:14 20 25 33 48 53 60 76 78 84 输入待查找数据:33 待查找数据存在
选择操作(A.新二叉排序树;B.继续查找;C.结束操作):B 输入待查找数据:54 待查找数据不存在
选择操作(A.新二叉排序树;B.继续查找;C.结束操作):C 谢谢使用!
Press any key to continue 二 概要设计
1、二叉排序树又称二叉查找树,对一个二叉树若规定:任一结点如果有左子树,其左子树各结点的数据必须小于该结点的数据;任一结点如果有右子树,其右子树各结点的数据必须大于该结点的数据。按这样规定构成的二叉树称为二叉排序树。对二叉排序树进行中序遍历所得到的结点序列是一个有序序列。
2、创建二叉排序树的非递归算法执行的步骤如下: ①生成一个新结点;
②与根结点进行比较,如果小于根结点,沿左链域比较,如果大于根结点,沿右链域比较;
③直至到终端,插入该结点。
以序列53,25,76,20,48,14,60,84,33,78为例,所创建的二叉排序树如图所示。
3、二叉排序树查找
二叉排序树查找的基本思路:查找过程从根结点开始,首先将它的关键字与给定值k进行比较,,如果相等,则查找成功,输出有关的信息;如果不等,若根结点关键字大于给定值k,向左子树继续查找,否则向右子树继续查找。向子树查找又是树状查找,先以子树的根结点数据与k进行比较,如果不相等又转向它的左子树或右子树继续查找。
4、本程序的基本操作和模块:
建立二叉排序树的函数:Create(BiTNode *B)
二叉树的中序遍历函数:Inorder(BiTNode *B,SeqStack &K) 查找函数:Search(BiTNode *B,int key) 主函数:main( )
函数的调用关系如下图所示:
三 详细设计
(一)元素类型、结点类型 1、二叉树结点的类型描述 typedef struct node { char data; //data用于存储二叉树中的字母 struct node *lchild; //lchild为指向该结点左孩子的指针 struct node *rchild; //rchild为指向该结点下一层的指针 }BiTNode;
2、顺序栈的类型描述 typedef struct { BiTNode *pin[40]; //指针数组,用于存储广义表结点指针 int top; //栈顶指针 }SeqStack;
(二)每个模块的分析 1、主程序模块 main() { ①定义根结点指针 ②定义栈并初始化栈 ③申请根结点空间,令根结点B的lchild域和rchild域为空
④调用创建二叉排序树函数 ⑤调用中序遍历二叉树函数 ⑥调用查找函数进行查找 }
2、建立二叉排序树的函数 void Create(BiTNode *B) {
①定义指向当前结点的指针p,新结点的指针q,初始时p为空 ②输入不是回车时执行以下操作 { 输入结点数据 ◎若该数据是第一个数据 { 第一个数据存到根节点,p指针指向根结点 } ◎若该数据不是第一个数据 { ①申请新结点q,将该数据存入q的data域
令新结点q的lchild域和rchild域为空
②p指向根结点 ③当p指针所指结点和q指针所指结点中的数据不同时执行以下操作 {
◎如果p结点数据小于新结点q中的数据,执行以下操作 { 如果p的右孩子为空,令p的右孩子为q 将p的右孩子赋p } ◎如果p结点数据大于新结点q中的数据,执行以下操作 { 如果p的左孩子为空,令p的左孩子为q 将p的左孩子赋p } } } } }
3、查找函数
void Search(BiTNode *B,int key) { ①定义指向当前结点的指针p,初始时p指向根结点 ②当p不为空且p所指结点的数据不为待查找数据时,执行以下操作 { 如果当前结点中的数据小于待查找数据,则令p指向它的右孩子
如果当前结点中的数据大于待查找数据,则令p指向它的左孩子
} 循环结束后,若p为空则待查找数据不存在;否则待查找数据存在 }
4、中序遍历二叉树树的函数
void Display(GLNode *G,SeqStack &K) { ①定义表示当前结点的指针p,并令p指根结点。 ②当栈不为空或当前结点指针p不为空时,执行以下操作 while(K.top!=-1||p!=NULL) {
a.如果当前结点指针p为空,执行以下操作:
出栈,栈顶元素所指的结点作为当前结点p 输出当前结点p中的数据
令当前结点p的rchild域所指的结点作为当前结点p b.如果当前结点指针p不为空,执行以下操作:
当前结点指针p入栈
令当前结点p的rchild域所指的结点作为当前结点p
} }
四 使用说明、测试分析及结果
1、程序使用说明:
(1)本程序运行环境为Visual C++ 6.0;
(2)根据界面提示进行操作:输入多个数据时以空格分隔,每次输入按回车表示输入结束 2、测试结果与分析:
请输入顶点数据:53 25 76 20 48 14 60 84 33 78 中序遍历结果为:14 20 25 33 48 53 60 76 78 84 输入待查找数据:33 待查找数据存在
选择操作(A.新二叉排序树;B.继续查找;C.结束操作):B 输入待查找数据:54 待查找数据不存在
选择操作(A.新二叉排序树;B.继续查找;C.结束操作):C 谢谢使用!
Press any key to continue
由上测试结果分析得,该程序功能满足题目要求。 3、调试过程中遇到的问题及解决方法
本次实验的错误的主要发生在二叉排序树查找,对进行循环操作的条件判断不够完整,输出数据的条件判断不正确,使运行中出现错误。原因是在p为空时,仍判断p中数据是否与待查找数据相等。
另外,本次实验中的其它小错误都很快修改正确。 4、运行界面
五、实验总结
本次实验提前作了预习,老师在课堂上有详细的讲解,所以此次实验比较顺利,我在11月23日完成了本次实验。
本次实验,我很感谢老师和同学对我的指点。通过本次实验,对二叉排序树有了更深的认识,学会了如何利用二叉排序树查找数据,对一些细节更加理解,收获了很多。
教师评语: 实验成绩:
指导教师签名:
批阅日期:
代码:
# include
//—————————————————————————————————————————— typedef struct node {
//data用于存储二叉树中的字母
//二叉树结点的类型描述
char data;
struct node *lchild; //lchild为指向该结点左孩子的指针 struct node *rchild; //rchild为指向该结点下一层的指针
}BiTNode;
//—————————————————————————————————————————— typedef struct {
BiTNode *pin[40]; int top;
//指针数组,用于存储广义表结点指针
//栈顶指针
//顺序栈的类型描述
}SeqStack;
//—————————————————————————————————————————— void Create(BiTNode *B) {
int m; char r; BiTNode *p,*q; p=NULL;
//定义指向当前结点的指针p,新结点的指针q
//初始时p为空
//建立二叉排序树的函数
printf(\请输入顶点数据:\while(r!='\\n') {
scanf(\ if(p==NULL) { } else {
q=(BiTNode *)malloc(sizeof(BiTNode)); q->data=m;
//申请新结点q
//令该数据存入当前结点的data域
//对于其它数据执行以下操作
B->data=m; p=B;
//输入结点数据
//第一个数据置到根节点,p指针指向根结点
//输入回车表示循环结束
q->lchild=NULL;q->rchild=NULL; p=B;
//令新结点q的lchild域和rchild域为空
}
}
}
while(p->data!=q->data) { }
if(p->data
//当p指针所指结点和q指针所指结点中的数据不同时执行以下操作
//如果p结点数据小于新结点q中的数据,执行以下操作
if(p->rchild==NULL)
p->rchild=q;
//如果p的右孩子为空,令p的右孩子为q
p=p->rchild; //将p的右孩子赋p
//如果p结点数据大于新结点q中的数据,执行以下操作
if(p->lchild==NULL)
p->lchild=q;
//如果p的左孩子为空,令p的左孩子为q
p=p->lchild; //将p的左孩子赋p
//—————————————————————————————————————————— void Search(BiTNode *B,int key) { }
//—————————————————————————————————————————— void Inorder(BiTNode *B,SeqStack &K) {
printf(\中序遍历结果为:\ BiTNode *p; p=B;
//提示以下结果为中序遍历结果
//p指针指向当前结点 //当前结点为根结点
//二叉树的中序遍历函数
BiTNode *p; p=B;
//定义指向当前结点的指针p //初始时p指向根结点
//查找函数
while(p!=NULL&&p->data!=key) { }
if(p->data p=p->rchild; //当p不为空且p所指结点的数据不为待查找数据时,执行以下操作 //如果当前结点中的数据小于待查找数据,则令p指向它的右孩子 else //如果当前结点中的数据大于待查找数据,则令p指向它的左孩子 p=p->lchild; if(p==NULL) printf(\待查找数据不存在\\n\循环结束后,若p为空则待查找数据不存在;否则待查找数据存在 else printf(\待查找数据存在\\n\printf(\ while(K.top!=-1||p!=NULL) { if(p==NULL) //当栈不为空或当前结点指针p不为空时,执行以下操作 //如果当前结点指针p为空,执行以下操作 } } { } else { } K.top++; //当前结点指针p入栈 //如果当前结点指针p不为空,执行以下操作 p=K.pin[K.top]; K.top--; printf(\p=p->rchild; //输出当前结点p中的数据 //令当前结点p的rchild域所指的结点作为当前结点p //出栈,栈顶元素所指的结点作为当前结点p K.pin[K.top]=p; p=p->lchild; //令当前结点p的rchild域所指的结点作为当前结点p printf(\ //—————————————————————————————————————————— int main() { int key; char a='A',b='B',c; BiTNode *B; SeqStack K; K.top=-1; while(a=='A') { } printf(\谢谢使用!\\n\ B=(BiTNode *)malloc(sizeof(BiTNode)); B->rchild=NULL;B->lchild=NULL; Create(B); Inorder(B,K); while(b=='B') { } a=c; b='B'; printf(\输入待查找数据:\ scanf(\//输入待查找数据 getchar(); Search(B,key); //进行查找 //申请根结点 //令根结点B的lchild域和rchild域为空 //创建二叉排序树 //中序遍历二叉树中的数据 //B表示查找数据操作 //A表示创建新的二叉排序树 //定义根结点指针 //定义栈并初始化栈 printf(\选择操作(A.新二叉排序树;B.继续查找;C.结束操作):\scanf(\printf(\b=c; //根据提示,选择下一步操作 } /** return 0; 请输入顶点数据:53 25 76 20 48 14 60 84 33 78 中序遍历结果为:14 20 25 33 48 53 60 76 78 84 输入待查找数据:33 待查找数据存在 选择操作(A.新二叉排序树;B.继续查找;C.结束操作):B 输入待查找数据:54 待查找数据不存在 选择操作(A.新二叉排序树;B.继续查找;C.结束操作):C 谢谢使用! Press any key to continue */
正在阅读:
数据结构 创建二叉排序树与查找01-28
工业和信息化部2011年食品安全重点工作实施方案印发05-26
什么是数据透视表07-26
湘雅医学院08上口腔内科学 考试评分标准04-11
纪委书记监委主任个人述职述廉报告09-13
广西蜂产业发展规划09-16
超星尔雅《心理、行为与文化》期末考试答案 - 满分04-11
《针灸学Z》1-4次作业06-28
形容声势浩大的成语02-11
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 数据结构
- 排序
- 查找
- 创建
- 毕业论文 - 图文
- PROJECT2实习报告
- 直齿圆柱齿轮范成实验
- 出租车司机防范意外注意事项
- 黑鹰坠落的影评
- 中国书法家协会历届理事会名单
- RX6600硬盘更换总结
- 安徽省实施《医院感染管理办法》细则
- 北京工业大学材料科学与工程学院硕士研究生招生研究方向简介
- 电大职业技能实训平台1.9.5《管理学基础》考核答案
- AOPA最新理论题库第6章起降阶段操作技术
- 小学科学教材分析(4) - 图文
- Womqdd天津农学院食品科学系的各种食品实验
- 土木工程施工组织试题库 - secret - 图文
- 第九章 弥散性血管内凝血
- 2010年国家公务员申论预测模拟试题(三)-中大网校
- 《好孩子是这样管教出来的》读后感
- 3至6年级英语单词表
- 四上句式课内复习
- 我国建立公益诉讼制度的必要性