数据结构-课程设计报告二叉排序树的实现
数据结构_二叉排序树实验报告

日 期:
实验成绩:
批阅日期:
【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】
五、概要设计
为了实现上述操作,应以构造体为存储构造。实现如下:
struct node
{
int key;//关键字的值
struct node *lchild,*rchild;//左右指针
}BSTNode,*BSTree;
1、根本操作:
〔1〕struct node
{
int key;//关键字的值
struct node *lchild,*rchild;//左右指针
2、输出的形式:建立好的排序二叉树的中序遍历结果。
3、程序所能到达的功能:能够通过键盘输入建立二叉排序树,并在建立完立即在屏幕显示中序遍历结果的程序
4、测试数据:输入45 24 53 12 28 90并用空格将数隔开,以0作为完毕符,如:
输入45 24 53 12 28 90
输出的中序遍历结果为:12 24 28 45 53 90
}BSTNode,*BSTree;
void InsertBST(BSTree *bst,int key) //二叉排序树的插入结点
{
BSTree s;
if(*bst==NULL)
{
s=(BSTree)malloc(sizeof(BSTNode));
s->key=key;
s->lchild=NULL;
{
if(bt!=NULL)
{
inorder(bt->lchild);
printf("%3d",bt->key) ;
inorder(bt->rchild);
二叉排序实现课程设计

二叉排序实现课程设计一、课程目标知识目标:1. 理解二叉排序树的基本概念,掌握其结构特点及操作原理;2. 学会使用二叉排序树进行数据排序,并掌握二叉排序树的插入、删除、查找等基本操作;3. 了解二叉排序树与其他排序算法的优缺点,明确其适用场景。
技能目标:1. 能够独立构建二叉排序树,进行数据的排序与查找;2. 能够分析并解决二叉排序树在实际应用中遇到的问题,如平衡二叉树、优化查找效率等;3. 能够运用所学知识,解决实际生活中的排序问题。
情感态度价值观目标:1. 培养学生的逻辑思维能力和问题解决能力,使其在面对复杂问题时,能够运用所学知识进行分析和解决;2. 增强学生的团队协作意识,通过小组讨论和实践,培养学生的沟通能力和合作精神;3. 激发学生的学习兴趣,使其在掌握二叉排序树的基础上,探索更多数据结构与算法的知识,为以后的学习打下坚实基础。
课程性质:本课程为数据结构与算法领域的基础课程,旨在帮助学生掌握二叉排序树的基本概念与操作方法,提高其编程实践能力。
学生特点:学生具备一定的编程基础,熟悉基本的数据结构和算法,但对二叉排序树的理解和应用尚浅。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析和动手实践,使学生深入理解二叉排序树,提高其编程水平。
同时,注重培养学生的逻辑思维和团队协作能力,提高其综合素质。
二、教学内容1. 引言:介绍排序算法在计算机科学中的应用,引出二叉排序树的概念及其重要性。
- 排序算法概述- 二叉排序树的基本概念2. 二叉排序树的构建与性质:- 二叉排序树的定义及结构- 二叉排序树的构建方法- 二叉排序树的性质与判定3. 二叉排序树的基本操作:- 插入操作- 删除操作- 查找操作- 遍历操作4. 二叉排序树的优化与应用:- 平衡二叉树的概念及实现- 二叉排序树在实际应用中的优化- 二叉排序树与其他排序算法的性能比较5. 实践与案例分析:- 动手实践:构建二叉排序树,实现基本操作- 案例分析:解决实际问题,分析二叉排序树的优缺点教学内容安排与进度:1. 引言与二叉排序树的构建:1课时2. 二叉排序树的基本操作:2课时3. 二叉排序树的优化与应用:2课时4. 实践与案例分析:3课时教材章节关联:1. 《数据结构与算法》第三章:树与二叉树2. 《数据结构与算法》第四章:二叉树的应用教学内容旨在帮助学生系统地掌握二叉排序树的相关知识,结合实践与案例分析,提高学生的编程实践能力和问题解决能力。
二叉排序树的实现数据结构课程设计

题目二叉排序树的实现一、开发背景数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
本课程设计中的二叉排序树,可以用顺序存储和链式存储两种算法计算。
本课程设计中的二叉排序树,一共要实现四项基本的功能。
它们分别是二叉搜索树的创建、中序遍历、查找结点和删除结点。
C语言是一种结构化语言。
它层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。
它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。
它还可以直接访问内存的物理地址,进行位(bit)一级的操作。
由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。
既可用于系统软件的开发,也适合于应用软件的开发。
C是C++的基础,C++语言和C语言在很多方面是兼容的,C++程序员可以利用C++与C的兼容性而直接并有效的使用大量现成的程序库,从而开发出更简洁更高效的系统。
需求分析:建立排序二叉树,主要是建立节点来存储输入的数据,需要建立函数来创造排序二叉树。
该题目包括三方面的内容:一个是二叉排序树的建立,而是二叉树的中序遍历,三是二叉树元素的查找并删除。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
关键词:二叉排序树;中序遍历;搜索结点;删除结点;C\C++二、课程设计题目1、二叉排序树的实现问题描述:用顺序和二叉链表作存储结构实现二叉排序树:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。
二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。
本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。
一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。
这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。
二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。
三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。
在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。
插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
重复这个过程,直到所有节点都被插入到树中。
2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。
首先,从根节点开始,将新节点的值与当前节点的值进行比较。
如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
如果新节点的值与当前节点的值相等,则不进行插入操作。
3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。
如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。
如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。
如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。
四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。
关于二叉排序树的实现

课程设计报告关于二叉排序树的实现一:需求分析1:基本要求a)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;b)对二叉排序树T作中序遍历,输出结果;c)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;2:设计要求:(1) 符合课题要求,实现相应功能;(2) 要求界面友好美观,操作方便易行;(3) 注意程序的实用性、安全性。
3:设计所采用的数据结构1:利用数组思想,通过改变数组指针来表示数组的左右子树,左子树的下标为2*i,右子树的下标为2*i+1.2:树的存储结构如下:#define N 100 /*二叉树结点的最大数目*/typedef struct{int *data; /*数组首址指针*/int lenth; /*数组长度*/}BST;4:每个模块的功能要求:初始化一个数组,开辟一块内存空间,先建立一个插入函数。
创建一棵二叉树,中序遍历该树在二叉排序树中查找其关键字等于给定值的结点是否存在删除所给结点,并对新树中序遍历最后,可以判断所给树是否为平衡树二:概要设计1:使用树的动态顺序存储结构,先初始化一个数组。
2:建立一个插入函数,通过调用该函数边查找边插入建立二叉排序树3:通过递归调用,中序遍历树,以及判断其是否为平衡树4:q.data=(int *)malloc(N*sizeof(int)); /*重新初始化一个数组Q*/ 新的数组储存删除给定结点的新树5:要实现二叉排序树,要先创建二叉排序树,在以下程序中利用边查找边插入来建立二叉排序树。
BST create(int *crew,int num) /*创建二叉排序树的函数*/{BST T;int i,j;T.data=(int *)malloc(N*sizeof(int)); /*数组初始化*/for(j=0;j<N;j++) T.data[j]=0;T.lenth=0;for(i=0;i<num;i++) /*边查找边插入建立二插排序树*/{insert(T,1,crew[i]);++T.lenth; /*记录树中结点的个数*/}return (T);}在这个过程中,调用了已经建立的函数insert(T,1,crew[i]); 为新结点查找到相应的位置,将其插入树中。
二叉排序树实验报告

深圳大学实验报告
课程名称:数据结构实验与课程设计
实验项目名称:二叉排序树实验
学院:计算机与软件学院
专业:
指导教师:
报告人:学号:班级: 3班
实验时间: 2012-11-28 实验报告提交时间: 2012-12-5
教务部制
int main(int argc,char *argv[])
{
int t[32];
int i,j,Key;
int TestNum,SampleNum;
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
BiSortTree *BST=new BiSortTree;
cin>>TestNum;
for(i=0;i<TestNum;i++){
cin>>SampleNum;
for(j=0;j<SampleNum;j++) cin>>t[j];
BST->CreateBST(t,SampleNum);
cin>>Key;
BST->SearchBST(Key);
cout<<BST->BisSuccess<<" "<<BST->BisPos <<" "<<BST->BisCount<<endl;
}
return 0;
}
运行截图:
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
数据结构二叉排序树实验报告
实验报告课程名:数据结构(C语言版)实验名:二叉排序树姓名:班级:学号:撰写时间:一实验目的与要求1.掌握二叉排序树上进行插入和删除的操作2.利用 C 语言实现该操作二实验内容•对于一个线形表, 利用不断插入的方法, 建立起一株二叉排序树•从该二叉排序树中删除一个叶子节点, 一个只有一个子树的非叶子节,一个有两个子树的非叶子节点。
三实验结果与分析#include<>#include<>删结点是叶子结点,直接删除if(p->left == NULL && p->right == NULL){删结点只有左子树else if(p->left && !(p->right)){p->left->parent=p->parent;删结点只有右孩子else if(p->right && !(p->left)){p->right->parent=p->parent;删除的结点既有左孩子,又有右孩子//该结点的后继结点肯定无左子树(参考上面查找后继结点函数)//删掉后继结点,后继结点的值代替该结点else{//找到要删除结点的后继q=searchSuccessor(p);temp=q->key;//删除后继结点deleteNode(root,q->key);p->key=temp;}return 1;}//创建一棵二叉查找树void create(PNode* root,KeyType *keyArray,int length) {int i;//逐个结点插入二叉树中for(i=0;i<length;i++)inseart(root,keyArray[i]);}int main(void){int i;PNode root=NULL;KeyType nodeArray[11]={15,6,18,3,7,17,20,2,4,13,9}; create(&root,nodeArray,11);for(i=0;i<2;i++)deleteNode(&root,nodeArray[i]);printf("%d\n",searchPredecessor(root)->key);printf("%d\n",searchSuccessor(root)->key);printf("%d\n",searchMin(root)->key);printf("%d\n",searchMax(root)->key);printf("%d\n",search(root,13)->key);return 0;}图1:二叉树排序实验结果。
二叉排序树的实现(最终版)
实验报告课程名称数据结构课程设计题目名称二叉树的实现学生学院应用数学学院专业班级 14信安1班学号 **********学生姓名阮志敏指导教师刘志煌2016年12月 9 日二叉排序树的实现一、内容和要求。
1)编程实现二叉排序树,包括生成、插入、删除;2)对二叉排序树进行先根、中根和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?5)格式按照作业的要求,对数据测试,分析,总结和改进的工作要做详细一点。
二、解决方案和关键代码1.二叉排序树的实现。
1)首先定义二叉树的结构体,代码如下:struct TreeNode;typedef struct TreeNode *TreePosition;typedef struct TreeNode *SearchTree;typedef struct TreeNode *Tree;typedef int TreeElementType;struct TreeNode {//二叉树TreeElementType element;//节点中的元素SearchTree left;//左儿子SearchTree right;//右儿子int leght;//节点的深度,用于打印int position;//节点的位置,用于打印};2)实现插入和生成二叉树节点的方法。
在这里用到了递归插入的方法。
SearchTree insertTreeNode(TreeElementType x,SearchTree tree){if(tree == NULL) {tree = makeTree(x,NULL,NULL);//插入在该处}else if(x < tree->element) {tree->left = insertTreeNode(x,tree->left);}else if(x > tree->element) {tree->right = insertTreeNode(x,tree->right);}//如果相等,什么也不做return tree;}当tree == NULL时,就是递归终止的条件,也是插入该节点的地方,在这里,用makeTree()方法创建一个节点,其代码如下:static SearchTree makeTree(TreeElementType x,SearchTree left,SearchTree right) {SearchTree node = (SearchTree)malloc(sizeof(struct TreeNode));if(node == NULL){printf("make TreeNode fail!\n");}else {node->element = x;node->left = left;node->right = right;}return node;}3)实现二叉树节点删除的方法。
数据结构课程设计_二叉排序树的实现
数据结构课程设计一、引言数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。
该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。
通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力。
数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。
学习数据结构的最终目的是为了获得求解问题的能力。
对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。
实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。
相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,我们都会有不同程度上的提高。
二、课程设计目的本课程是数据结构课程的实践环节。
主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C++或其他语言中应用这些算法的能力。
通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。
三、内容设计要求二叉排序树的实现:用顺序和二叉链表作存储结构1)以回车(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;2)对二叉排序树T作中序遍历,输出结果;3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。
(一)问题分析和任务定义对问题的描述应避开具体的算法和涉及的数据结构,它是对要完成的任务作出明确的回答,强调的是做什么,而不是怎么做。
(二)详细的设计和编码算法的具体描述和代码的书写。
(三)上机调试源程序的输入和代码的调试。
数据结构二叉排序树课程设计报告
课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (3)二、原理分析及流程 (3)2.1、原理分析 (3)2.2、流程图 (4)1、main()函数 (4)2、创建 (4)3、插入 (5)4、查找 (6)5、中序遍历输出 (7)三、算法描述 (8)3.1、存储结构 (8)3.2、插入算法 (8)3.3、查找算法 (9)3.4、删除算法 (10)四、小结与体会 (12)五、程序执行过程 (13)5.1、创建二叉排序树并中序输出 (13)5.2、插入并中序输出 (13)5.3、查找 (14)六、程序清单 (14)一、课程设计简介1.1、题目:二叉排序树相关操作1、创建二叉排序树;2、插入给定值;3、查找给定值;4、删除给定值的结点。
1.2、报告要求:1、封面;2、题目与流程图或模块图;3、程序清单和运行结果;4、小结(收获和体会);5、装订成册。
1.3、目的:课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力。
二、原理分析及流程2.1、原理分析:根据题目要求,要实现这些功能,就必须创建一个菜单。
这个菜单设置在main()函数里面,然后使用while()...switch()语句进行循环调用相关函数,以达到实现相关功能的目的。
2.2、流程图:1、main()函数:23、插入:4、查找:5、中序遍历输出:三、算法描述3.1、存储结构定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:#include <stdio.h>#define null 0typedef int keytype;typedef struct node{keytype key;struct node *lchild,*rchild;}bstnode,*bstree;3.2、插入算法在二叉排序树中插入一个新节点,首先要查找该节点在二叉排序树中是否已经存在。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程名称数据构造课程设计题目名称二叉排序树的实现学院应用数学学院专业班级学号学生XX指导教师2013 年12 月26 日1.设计任务1)实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、XX、成绩3项),比照查找效率,并说明为什么二叉排序树效率高〔或者低〕。
2. 函数模块:2.1.主函数main模块功能1.通过bstree CreatTree()操作建立二叉排序树。
2.在二叉排序树t中通过操作bstree InsertBST(bstree t,intkey,nametype name,double grade)插入一个节点。
3. 从二叉排序树t中通过操作void Delete(bstree &p)删除任意节点。
4. 在二叉排序树t中通过操作bstnode *SearchBST(bstree t,keytype key)查找节点。
5. 在二叉排序树t中通过操作p=SearchBST(t,key)查询,并修改节点信息6. 非递归遍历二叉排序树。
7. 定义函数void pare()对数组和二叉排序树的查找效率进展比拟比拟。
2.2创立二叉排序树CreatTree模块从键盘中输入关键字及记录,并同时调用插入函数并不断进展插入。
最后,返回根节点T。
2.3删除模块:二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。
假设二叉排序树上删除节点为*p〔指向节点的指针为p〕,其双亲节点为*f〔节点指针为f〕。
假设*p节点为叶子节点,那么即左右均为空树,由于删去叶子节点不破坏整棵树的构造,那么只需修改其双亲节点的指针即可;假设*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;假设*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱〔或直接后继〕替代*p,然后再从二叉排序树中删去它的直接前驱〔或直接后继〕。
在二叉排序树中删除一个节点的算法为void DeleteData(bstree &t,keytype key)假设二叉排序树t中存在关键字等于key的数据元素,那么删除该数据元素节点,并返回TRUE,否那么返回FALSE。
2.4插入模块二叉排序树是一种动态树表,其特点是树的构造通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进展插入。
新插入的节点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个节点的左孩子或右孩子的节点。
一个无序系列可以通过构造一棵二叉排序树而变成一个有序系列,构造树的过程即为对无序系列进展排序的过程,并且每次插入的节点都是二叉排序树上新的叶子节点,那么在进展插入操作时,不必移动其他节点,仅需改变某个节点的指针由空变为非空即可。
二叉排序树的插入算法为bstree InsertBST(bstree t,int key,nametype name,double grade)假设二叉排序树中不存在关键字等于key的数据元素时,插入元素并返回TRUE。
2.5查找模块二叉排序树又称二叉查找树,当二叉排序树不为空时,首先将给定的值和根节点的关键字比拟,假设相等那么查找成功,否那么将依据给定的值和根节点关键字之间的大小关系,分别在左子树或右子树上继续进展查找。
为此定义一个二叉排序树的查找算法为bstnode *SearchBST(bstree t,keytype key)在根指针t所指向的二叉排序树中查找关键字等于key的数据元素,如成功,返回指向该元素节点的指针,否那么返回空指针。
2.6效率比拟pare模块void pare()对数组和二叉排序树的查找效率进展比拟比拟。
2.7二叉排序树的遍历先序遍历也叫做先根遍历。
首先访问根结点然后遍历左子树,最后遍历右子树。
在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空那么返回。
其实过程为:先遍历左子树root->left->left->left...->null,由于是先序遍历,因此一遇到节点,便需要立即访问;由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。
其一可以用栈记忆在访问途中将依次遇到的节点保存下来。
根据栈的先进后出、后进先出的特点特点。
那么可以用栈保存。
每次都将遇到的节点压入栈,当左子树遍历完毕后从栈中弹出最后一个访问的节点,然后访问其右子树。
根本算法思想:1.先访问根节点,将根节点入栈2.重复执行两大步骤:如果该节点左孩子存在,那么访问该左孩子节点,并将其指针入栈。
重复以上操作,直到节点的左孩子不存在。
将栈顶的元素,即其指针出栈,回到父节点,如果该指针节点的右孩子存在,那么将该指针指向的右孩子节点重复执行以上步骤,直到桟为空为止。
操作函数为void x_print(Tree T)中序遍历:中序遍历和先序遍历访问的顺序不同。
中序遍历访问顺序为中序遍历左子数,在访问根节点,最后中序遍历右子树。
先序遍历是先访问,再入栈;而中序遍历那么是先入栈,弹栈后再访问。
将二叉树的根节点入栈,如果该节点有左孩子,将左孩子直接入栈,重复该操作,直到该节点无左孩子;在将栈顶元素出栈,并访问该节点指向的节点,如果该指针指向的右孩子存在,那么将当前指针指向右孩子节点。
重复执行步骤直到栈为空为止。
操作函数为void z_print(Tree T )。
后序遍历:先后序遍历左子树,在后序遍历右子树,最后访问根节点。
先将根节点入栈,如果该节点左孩子节点存在,将该节点左孩子节点入栈。
重复执行此操作,直到节点左孩子节点为空。
取栈顶元素,并赋值给P,如果P 的右孩子为空或P的右孩子等于q〔即如果p的右孩子已访问,那么访问根节点,即p指向的节点,并用q来记录刚刚访问的节点的指针〕,假设p有右孩子,且右孩子没有别访问过,那么p=p->rchild。
操作函数为void h_print(Tree T)3.源代码#include<stdio.h>#include<iostream>#include<string>#include<time.h>#include <iomanip>using namespace std;typedef string nametype;typedef unsigned long keytype;typedef struct node //结点的构造体{keytype key;nametype name;int grade;struct node *lchild,*rchild;}bstnode;typedef bstnode *bstree;//栈的定义//typedef struct{ //栈构造bstree *base;bstree *top;int stacksize;}Sqstack;int InitStack (Sqstack &s) //建立一个空栈{s.base=(bstree*)malloc(1000 * sizeof(int));s.top=s.base;return 1;};int Push(Sqstack &s ,node *e)//在栈顶插入元素〔进栈〕{*s.top=e;s.top=s.top+1;return 1;};int Pop(Sqstack &s, bstree &e)//出栈{if(s.top==s.base)return 0;else s.top=s.top-1;e=*s.top;return 1;};//非递归历遍并输出结点信息///*---------------先序非递归遍历---------------*/ void x_print(node *t){Sqstack s;InitStack(s);bstnode *p;p=t;while(p||!(s.top==s.base)){if(p){Push(s,p);cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<"\t"<<endl;p=p->lchild;}else{Pop(s,p);p=p->rchild;}}}/*---------------中序非递归遍历---------------*/ void z_print(node *t){Sqstack s;InitStack(s);bstnode *p;while(p||!(s.top==s.base)){if(p){Push(s,p);p=p->lchild;}else{Pop(s,p);cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<"\t"<<endl;p=p->rchild;}}}/*---------------非递归后序遍历---------------*/void h_print(node *t){Sqstack s;InitStack(s);node *p,*q;p=t;q=NULL;while(p || !(s.top==s.base)){if(p){Push(s,p);p=p->lchild;}else{p=*(s.top-1);if(p->rchild==q){Pop(s,q);p=NULL;cout<<q->key<<"\t"<<setw(20);cout<<q->name<<"\t"<<setw(20);cout<<q->grade<<"\t"<<endl;}elsep=p->rchild;q=NULL;}}}}//递归查找二叉树///*---归查找,假设找到就返回指向该结点的指针,否那么返回空---*/ bstnode *SearchBST(bstree t,keytype key) {if(t==NULL||key==t->key)return t;if(key<t->key)return SearchBST(t->lchild ,key);elsereturn SearchBST(t->rchild ,key);}//-------------------给定学生信息插入到二叉树中-------------------// bstree InsertBST(bstree t,int key,nametype name,double grade){bstree p,q;if(t==NULL) //树初始为空,新建二叉树{t=new bstnode();t->key=key;t->name=name;t->grade=grade;t->lchild=t->rchild=NULL;}else{p=t;while(p) //树已存在,按照二叉排序树的特性查找{q=p;if(p->key>key)p=q->lchild;else if(p->key<key)p=q->rchild;else{cout<<endl;cout<<"树中已有该节点:"<<key<<endl;cout<<endl;return t;}p=new bstnode(); //找不到结点就新建一个结点插入到二叉排序树中p->key=key;p->name=name;p->grade=grade;p->lchild=p->rchild=NULL;if(q->key>key)q->lchild=p;elseq->rchild=p;}return t;}//-------------------二叉树排序树的构建-------------------//bstree CreatTree() //不断输入学生信息以插入到二叉树中{bstree t=NULL;keytype key;nametype name;double grade;cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<<endl;cin>>key;if(key==0)return t;cin>>name;cin>>grade;while(key) //key==0时退出{t=InsertBST(t,key,name,grade);cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<<endl;cin>>key;if(key==0)break;cin>>name;cin>>grade;}return t;}//-------------------删除树中的结点-------------------//void Delete(bstree &p) //删除结点的函数{bstree q,s;if(!p->rchild){q=p;p=q->lchild ;delete q;}else if(!p->lchild){q=p;p=p->rchild;delete q;}else{q=p;s=p->lchild;while(s->rchild){q=s;s=s->rchild;}p->name=s->name;if(q!=p)q->rchild=s->lchild;elseq->lchild=s->lchild;delete s;}}void DeleteData(bstree &t,keytype key){if(!t){cout<<"没有该信息,请重新输入!";cin>>key;DeleteData(t,key);}else{if(t->key==key){Delete(t); //假设找到结点直接删除cout<<"删除成功!"<<endl;}else if(t->key>key)DeleteData(t->lchild,key); //结点数据比查找关键字大,继续在其左子树中查找elseDeleteData(t->rchild,key); //结点数据比查找关键字小,继续在其右子树中查找}}//数组和二叉排序树的查找效率比拟//void pare(){bstree t=NULL;clock_t start,end,start1,end1;int num=0;int a=0;int b=0;int c=0;int d=1;bstree p;string key,name;double grade;nametype str [100][3];//cout<<"〔输入0时完毕〕"<<endl;cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<<endl;cin>>key;if(key=="0")return ;cin>>name;cin>>grade;while(key!="0"){str[num][0]=key;str[num][1]=name;str[num][2]=grade;int key1=atoi(key.c_str()); //用库函数将字符串转化为关键字的int型t=InsertBST(t,key1,name,grade); //插入结点cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<<endl;cin>>key;if(key=="0")break;cin>>name;cin>>grade;num++;}cout<<endl;cout<<"进展数组和二叉排序树的查询效率比拟〔比拟:1 不比拟:0〕";cin>>d;while(d!=NULL){switch(d){case 0:cout<<"返回选择界面"<<endl;break;case 1:cout<<"数组查询!"<<endl;cout<<"请输入查询的成绩:"<<endl;cin>>key;start=clock();while(a<=10000000) //循环模拟数组查找{while(b<=99){if(str[b][0]==key){b=100;}elseb++;}b=0;a++;}end=clock();if(num>=100)cout<<"数组查询:无查询信息,花费时间: "<<end-start<<" 毫秒"<<endl;elsecout<<"数组查询:查到信息,花费时间: "<<end-start<<" 毫秒"<<endl;int key1=atoi(key.c_str()); //同上转化start1=clock();while(c<=10000000) //用循环来模拟树中查找{p=SearchBST(t,key1);c++;}end1=clock();if(p==NULL)cout<<"树查询:无查询信息,花费时间: "<<end1-start1<<" 毫秒"<<endl;elsecout<<"树查询:查到信息,花费时间: "<<end1-start1<<" 毫秒"<<endl;a=0;b=0;c=0;break;}cout<<"是否继续进展操作〔是:1 否:0〕:";cin>>d;}}//二叉树的深度int TreeDepth(bstree t){int left,right,max;if(t!=NULL){left=TreeDepth(t->lchild);right=TreeDepth(t->rchild);max=left>right?left:right;return max+1;}else{return 0;}}//树状输出二叉树void PrintTree(bstree t,int layer){int k;if(t==NULL)return ;PrintTree(t->rchild,layer+1);for(k=0;k<layer;k++)cout<<" ";cout<<t->key<<"\n";PrintTree(t->lchild,layer+1);}//-------------------主函数测试-------------------//int main(){int d;keytype key;bstree t=NULL;t=CreatTree();d=TreeDepth(t);cout<<"二叉排序树的树形表示如下"<<endl;PrintTree(t,d);char choose;nametype name;bstree p;double grade;cout<<" "<<endl;cout<<"-----------------------------请输入你要选择的操作-------------------------------"<<endl; cout<<" |-------------------------------------|"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" || a 插入信息||"<<endl; cout<<" || b 删除信息||"<<endl; cout<<" || c 查询信息||"<<endl; cout<<" || d 修改信息||"<<endl; cout<<" || 0 退出||"<<endl; cout<<" || e 对二叉排序树进展非递归遍历||"<<endl; cout<<" || f 进展数组和二叉树查找效率实验||"<<endl; cout<<" ||-----------------------------------||"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<endl;cout<<"需要选择的操作为:";cin>>choose;cout<<endl;while(choose){switch(choose){case 'a'://cout<<"输入学生信息信息〔学号为0时完毕〕."<<endl;cout<<"请输入---学号---XX---成绩---〔输入0时完毕〕:"<<endl;cin>>key;if(key==0) /*{PrintTree(t,d);break;}*/cin>>name;cin>>grade;while(key){t=InsertBST(t,key,name,grade);cout<<"请输入---学号---XX---成绩---:"<<endl;cin>>key;if(key==0)break;cin>>name;cin>>grade;}break;case 'b':cout<<"请输入要删除信息学生的成绩:"<<endl;cin>>key;DeleteData(t,key);d=TreeDepth(t);cout<<"删除结点后二叉树的树形显示如下"<<endl;PrintTree(t,d);break;case 'c':cout<<"请输入要查询的成绩:"<<endl;cin>>key;p=SearchBST(t,key);if(p==NULL)cout<<"无查询的关键字:"<<key<<endl;elsecout<<"成绩"<<"\t"<<setw(20)<<"XX"<<"\t"<<setw(20)<<"学号"<<endl;cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<endl;break;case 'd':cout<<"请输入要修改的学号:"<<endl;cin>>key;p=SearchBST(t,key);if(p==NULL)cout<<"无你所要修改的关键字:"<<key<<endl;else{cout<<"请输入修改的XX:";cin>>name;cout<<"请输入修改的成绩:";cin>>grade;p->name=name;p->grade=grade;}break;case 'e':if(!t)cout<<"没有任何信息,请先输入信息!";else{cout<<"学号"<<"\t"<<setw(20)<<"XX"<<"\t"<<setw(20)<<"成绩"<<endl;cout<<"------------------非递归先序遍历----------------"<<endl;cout<<endl;x_print(t);cout<<"------------------非递归中序遍历-----------------"<<endl;cout<<endl;z_print(t);cout<<"------------------非递归后序遍历-----------------"<<endl;cout<<endl;h_print(t);}break;case 'f':cout<<"***此实验为独立实验,实验数据独立于外部数据***"<<endl;cout<<"***请重新输入相关信息***"<<endl;pare();break;default:cout<<"选择错误!";break;}cout<<endl;cout<<endl;cout<<" "<<endl;cout<<"-----------------------------请输入你要选择的操作-------------------------------"<<endl; cout<<" |-------------------------------------|"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" || a 插入信息||"<<endl; cout<<" || b 删除信息||"<<endl; cout<<" || c 查询信息||"<<endl; cout<<" || d 修改信息||"<<endl; cout<<" || 0 退出||"<<endl; cout<<" || e 对二叉排序树进展非递归遍历||"<<endl; cout<<" || f 进展数组和二叉树查找效率实验||"<<endl; cout<<" ||-----------------------------------||"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<endl;cout<<"选择的操作位:";cin>>choose;cout<<endl;}return 0;}4.运行结果及截图从键盘读入数据以0作为完毕标志可得二叉排序树树状表示主菜单项选择择模块需要在树种添加节点那么执行操作a 需要在书中删除节点执行操作b需要查询节点信息执行操作c修改某一节点信息执行操作d执行操作0退出程序执行执行操作e对树进展先序遍历、后序遍历、中序遍历运行结果如下列图需要对树和数组的查询效率比拟执行操作f4.实验结论栈是仅表尾进展插入和删除的线性表,栈的顺序存储构造是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,并同时附设指针top指示栈顶元素在顺序栈中的位置。