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

合集下载

数据结构c语言课设-二叉树排序

数据结构c语言课设-二叉树排序

题目:二叉排序树的实现1 内容和要求1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进展先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),比照查找效率,并说明在什么情况下二叉排序树效率高,为什么?2 解决方案和关键代码2.1 解决方案:先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。

前中后根遍历需要用到栈的数据构造,分模块编写栈与遍历代码。

要求比照二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock〔〕函数记录查找时间来比照查找效率。

2.2关键代码树的根本构造定义及根本函数typedef struct{KeyType key;} ElemType;typedef struct BiTNode//定义链表{ElemType data;struct BiTNode *lchild, *rchild;}BiTNode, *BiTree, *SElemType;//销毁树int DestroyBiTree(BiTree &T){if (T != NULL)free(T);return 0;}//清空树int ClearBiTree(BiTree &T){if (T != NULL){T->lchild = NULL;T->rchild = NULL;T = NULL;}return 0;}//查找关键字,指针p返回int SearchBST(BiTree T, KeyType key, BiTree f, BiTree &p) {if (!T){p = f;return FALSE;}else if EQ(key, T->data.key){p = T;return TRUE;}else if LT(key, T->data.key)return SearchBST(T->lchild, key, T, p);elsereturn SearchBST(T->rchild, key, T, p);}二叉树的生成、插入,删除生成void CreateBST(BiTree &BT, BiTree p){int i;ElemType k;printf("请输入元素值以创立排序二叉树:\n");scanf_s("%d", &k.key);for (i = 0; k.key != NULL; i++){//判断是否重复if (!SearchBST(BT, k.key, NULL, p)){InsertBST(BT, k);scanf_s("%d", &k.key);}else{printf("输入数据重复!\n");return;}}}插入int InsertBST(BiTree &T, ElemType e){BiTree s, p;if (!SearchBST(T, e.key, NULL, p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p)T = s;else if LT(e.key, p->data.key)p->lchild = s;elsep->rchild = s;return TRUE;}else return FALSE;}删除//某个节点元素的删除int DeleteEle(BiTree &p){BiTree q, s;if (!p->rchild) //右子树为空{q = p;p = p->lchild;free(q);}else if (!p->lchild) //左子树为空{q = p;p = p->rchild;free(q);}else{q = p;s = p->lchild;while (s->rchild){q = s;s = s->rchild;}p->data = s->data;if (q != p)q->rchild = s->lchild;elseq->lchild = s->lchild;delete s;}return TRUE;}//整棵树的删除int DeleteBST(BiTree &T, KeyType key) //实现二叉排序树的删除操作{if (!T){return FALSE;}else{if (EQ(key, T->data.key)) //是否相等return DeleteEle(T);else if (LT(key, T->data.key)) //是否小于return DeleteBST(T->lchild, key);elsereturn DeleteBST(T->rchild, key);}return 0;}二叉树的前中后根遍历栈的定义typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int InitStack(SqStack &S) //构造空栈{S.base = (SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackint Push(SqStack &S, SElemType e) //插入元素e为新栈顶{if (S.top - S.base >= S.stacksize){S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//Pushint Pop(SqStack &S, SElemType &e) //删除栈顶,应用e返回其值{if (S.top == S.base) return ERROR;e = *--S.top;return OK;}//Popint StackEmpty(SqStack S) //判断是否为空栈{if (S.base == S.top) return TRUE;return FALSE;}先根遍历int PreOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);if (!Visit(p->data)) return ERROR;p = p->lchild;}else{Pop(S, p);p = p->rchild;}}return OK;}中根遍历int InOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S;BiTree p;InitStack(S);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);p = p->lchild;}else{Pop(S, p);if (!Visit(p->data)) return ERROR;p = p->rchild;}}return OK;}后根遍历int PostOrderTraverse(BiTree T, int(*Visit)(ElemType e)) {SqStack S, SS;BiTree p;InitStack(S);InitStack(SS);p = T;while (p || !StackEmpty(S)){if (p){Push(S, p);Push(SS, p);p = p->rchild;}else{if (!StackEmpty(S)){Pop(S, p);p = p->lchild;}}}while (!StackEmpty(SS)){Pop(SS, p);if (!Visit(p->data)) return ERROR;}return OK;}利用数组存储一个班学生信息ElemType a[] = { 51, "陈继真", 88,82, "黄景元", 89,53, "贾成", 88,44, "呼颜", 90,25, "鲁修德", 88,56, "须成", 88,47, "孙祥", 87, 38, "柏有患", 89, 9, " 革高", 89, 10, "考鬲", 87, 31, "李燧", 86, 12, "夏祥", 89, 53, "余惠", 84, 4, "鲁芝", 90, 75, "黄丙庆", 88, 16, "李应", 89, 87, "杨志", 86, 18, "李逵", 89, 9, "阮小五", 85, 20, "史进", 88, 21, "秦明", 88, 82, "杨雄", 89, 23, "刘唐", 85, 64, "武松", 88, 25, "李俊", 88, 86, "卢俊义", 88, 27, "华荣", 87, 28, "杨胜", 88, 29, "林冲", 89, 70, "李跃", 85, 31, "蓝虎", 90, 32, "宋禄", 84, 73, "鲁智深", 89, 34, "关斌", 90, 55, "龚成", 87, 36, "黄乌", 87, 57, "孔道灵", 87, 38, "张焕", 84, 59, "李信", 88, 30, "徐山", 83, 41, "秦祥", 85, 42, "葛公", 85, 23, "武衍公", 87, 94, "范斌", 83, 45, "黄乌", 60, 67, "叶景昌", 99, 7, "焦龙", 89, 78, "星姚烨", 85, 49, "孙吉", 90, 60, "陈梦庚", 95,};数组查询函数void ArraySearch(ElemType a[], int key, int length){int i;for (i = 0; i <= length; i++){if (key == a[i].key){cout << "学号:" << a[i].key << " 姓名:" << a[i].name << " 成绩:" << a[i].grade << endl;break;}}}二叉树查询函数上文二叉树根本函数中的SearchBST()即为二叉树查询函数。

数据结构课程设计

数据结构课程设计

“数据结构”课程设计报告二叉排序树的查找与性能分析学生姓名:段晓宣,张静指导教师:陈少军所在系:电子信息系所学专业:计算机科学与技术年级: 2010级计算机(1)班目录第一章需求分析1.1选题要求 (3)1.2选题的背景与意义 (3)1.3本组课程设计的目标 (3)1.4人员组成和分工 (3)第2章概要分析 (4)2.1系统数据流图 (4)2.2原始数据 (4)2.3输出数据 (4)2.4对数据的处理 (5)2.5数据结构 (5)2.6模块划分 (5)第3章详细设计 (6)3.1二叉排序树的创建 (6)3.2二叉排序树的插入 (7)3.3二叉排序树的查找 (7)3.4计算多数据的平均查找长度 (9)3.5主函数 (9)第4章用户手册 (10)4.1 用户须知 (10)第5章系统测试 (11)项目总结 (12)参考文献 (13)二叉树排序树的查找与性能分析摘要:21世纪是信息化的时代,计算机深入到生活的各个领域。

随着计算机的发展,许多高科技产品如雨后春笋应运而生。

但究其本质而言,无非是以前的理论加以包装。

对于数据控制、管理及处理等方面也可见一斑。

在如今应用的计算机的数据存储方式仍然主要以线性,树型,图型等为主要的及结构。

因此了解并掌握数据结构的知识是很有必要的。

在此次实训期间,本组人员通过运用所学数据结构的知识,进行以二叉排序树的查找与性能分析为题的课程设计,在同组人员的共同努力下,基本实现了:1.创建二叉排序树2.利用文件存储二叉排序树3.二叉排序树的插入4.二叉排序树的查找5.二叉排序树平均查找长度的算法第1章需求分析1.1选题要求(1)根据输入的先序及递归建立二叉排序树;(2)通过文件,向二叉排序树插入结点,并生成二叉树;(3)设置报名号为关键字,可以根据关键字进行查找;(5)查找的同时可以判断比较的次数;(6)根据查找的算法计算出10000个数据平均查找长度;1.2选题的背景与意义(1)树型存储结构数据存储结构中重要的组成部分,二叉树由是树的重点。

二叉排序树的实验报告

二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。

本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。

一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。

这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。

二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。

三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。

在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。

插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

重复这个过程,直到所有节点都被插入到树中。

2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。

首先,从根节点开始,将新节点的值与当前节点的值进行比较。

如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

如果新节点的值与当前节点的值相等,则不进行插入操作。

3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。

如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。

如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。

如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。

四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。

数据结构-二叉排序树

数据结构-二叉排序树

二叉排序树操作一、设计步骤1)分析课程设计题目的要求2)写出详细设计说明3)编写程序代码,调试程序使其能正确运行4)设计完成的软件要便于操作和使用5)设计完成后提交课程设计报告(一)程序功能:1)创建二叉排序树2)输出二叉排序树3)在二叉排序树中插入新结点4)在二叉排序树中删除给定的值5)在二叉排序树中查找所给定的值(二)函数功能:1) struct BiTnode 定义二叉链表结点类型包含结点的信息2) class BT 二叉排序树类,以实现二叉排序树的相关操作3) InitBitree() 构造函数,使根节点指向空4) ~BT () 析构函数,释放结点空间5) void InsertBST(&t,key) 实现二叉排序树的插入功能6) int SearchBST(t,key) 实现二叉排序树的查找功能7) int DelBST(&t,key) 实现二叉排序树的删除功能8) void InorderBiTree (t) 实现二叉排序树的排序(输出功能)9) int main() 主函数,用来完成对二叉排序树类中各个函数的测试二、设计理论分析方法(一)二叉排序树定义首先,我们应该明确所谓二叉排序树是指满足下列条件的二叉树:(1)左子树上的所有结点值均小于根结点值;(2)右子数上的所有结点值均不小于根结点值;(3)左、右子数也满足上述两个条件。

根据对上述的理解和分析,我们就可以先创建出一个二叉链表结点的结构体类型(struct BiTNode)和一个二叉排序树类(class BT),以及类中的构造函数、析构函数和其他实现相关功能的函数。

(二)插入函数(void InsertBST(&t,key))首先定义一个与BiTNode<k> *BT同一类型的结点p,并为其申请空间,使p->data=key,p->lchild和p->rchild=NULL。

二叉排序树实验报告

二叉排序树实验报告

深圳大学实验报告
课程名称:数据结构实验与课程设计
实验项目名称:二叉排序树实验
学院:计算机与软件学院
专业:
指导教师:
报告人:学号:班级: 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日内。

数据结构实验三——二叉树基本操作及运算实验报告

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》实验报告实验题目二叉树的基本操作及运算一、需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。

问题分析:二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。

由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。

处理本问题,我觉得应该:1、建立二叉树;2、通过递归方法来遍历(先序、中序和后序)二叉树;3、通过队列应用来实现对二叉树的层次遍历;4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;5、运用广义表对二叉树进行广义表形式的打印。

算法规定:输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。

输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。

对二叉树的一些运算结果以整型输出。

程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。

计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。

对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。

测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E预测结果:先序遍历ABCDEGF中序遍历CBEGDFA后序遍历CGEFDBA层次遍历ABCDEFG广义表打印A(B(C,D(E(,G),F)))叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2查找5,成功,查找的元素为E删除E后,以广义表形式打印A(B(C,D(,F)))输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B预测结果:先序遍历ABDEHCFG中序遍历DBHEAGFC后序遍历DHEBGFCA层次遍历ABCDEFHG广义表打印A(B(D,E(H)),C(F(,G)))叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3查找10,失败。

山东大学数据结构实验报告四

山东大学数据结构实验报告四

山东大学数据结构实验报告四一、引言数据结构实验报告四旨在通过实践巩固和应用所学的数据结构知识,培养学生的编程能力和问题解决能力。

本次实验的主要目的是设计并实现一个基于数据结构的应用程序,通过使用合适的数据结构和算法解决实际问题。

二、实验内容本次实验要求设计一个程序,实现以下功能:1. 输入一组整数,建立一个二叉排序树;2. 实现二叉排序树的查找、插入和删除操作;3. 对建立的二叉排序树进行中序遍历,并输出排序结果。

三、实验步骤1. 设计二叉排序树的数据结构在开始编写代码之前,我们需要先设计二叉排序树的数据结构。

二叉排序树的每个节点包含一个整数值和两个指针,分别指向左子树和右子树。

2. 实现二叉排序树的建立首先,我们需要实现一个函数,用于创建二叉排序树。

该函数根据输入的一组整数,逐个插入到二叉排序树中。

具体步骤如下:- 创建一个空的二叉排序树;- 依次读取输入的整数,并将其插入到二叉排序树中的合适位置;- 返回建立好的二叉排序树。

3. 实现二叉排序树的查找在二叉排序树中查找一个特定的值,可以使用递归或迭代的方式实现。

具体步骤如下:- 如果当前节点为空,返回空指针;- 如果当前节点的值等于目标值,返回当前节点;- 如果目标值小于当前节点的值,递归地在左子树中查找;- 如果目标值大于当前节点的值,递归地在右子树中查找。

4. 实现二叉排序树的插入在二叉排序树中插入一个新的值,需要保持二叉排序树的有序性。

具体步骤如下:- 如果树为空,将新值作为根节点插入;- 如果新值小于当前节点的值,将新值插入到左子树中;- 如果新值大于当前节点的值,将新值插入到右子树中。

5. 实现二叉排序树的删除在二叉排序树中删除一个特定的值,需要保持二叉排序树的有序性。

具体步骤如下:- 如果树为空,返回空指针;- 如果目标值小于当前节点的值,递归地在左子树中删除;- 如果目标值大于当前节点的值,递归地在右子树中删除;- 如果目标值等于当前节点的值,进行删除操作。

二叉排序树课程设计

二叉排序树课程设计

二叉排序树课程设计一、课程目标知识目标:1. 理解二叉排序树的概念和特点;2. 掌握二叉排序树的插入、删除和查找操作;3. 能够分析二叉排序树的时间复杂度;4. 了解二叉排序树在实际应用中的优势。

技能目标:1. 能够手动构建二叉排序树并进行基本操作;2. 能够运用编程语言实现二叉排序树的基本功能;3. 能够分析并解决二叉排序树相关的问题;4. 能够运用二叉排序树解决实际排序和查找问题。

情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情;2. 培养学生的逻辑思维能力和问题解决能力;3. 培养学生的团队协作意识,学会与他人共同分析、解决问题;4. 培养学生严谨的科学态度,注重算法的正确性和效率。

课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在让学生掌握二叉排序树的基本概念和操作,提高学生的编程能力和逻辑思维能力。

学生特点:学生具备基本的计算机知识和编程基础,对数据结构有一定了解,但对二叉排序树的认识可能较浅。

教学要求:结合学生特点,采用讲解、实践和讨论相结合的教学方法,使学生在理解二叉排序树理论知识的基础上,能够动手实践并解决实际问题。

在教学过程中,注重培养学生的自主学习能力和团队合作精神,提高学生的综合素质。

通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程打下坚实基础。

二、教学内容1. 引入二叉排序树的概念,阐述其定义、性质和应用场景;- 教材章节:第三章第一节“二叉排序树的定义和性质”2. 讲解二叉排序树的插入、删除、查找操作及其实现方法;- 教材章节:第三章第二节“二叉排序树的操作”3. 分析二叉排序树的性能特点,包括时间复杂度和空间复杂度;- 教材章节:第三章第三节“二叉排序树的性能分析”4. 介绍二叉排序树在实际应用中的优势,如排序、查找等;- 教材章节:第三章第四节“二叉排序树的应用”5. 结合实例,让学生动手实践二叉排序树的构建和操作;- 教材章节:第三章实例分析与编程练习6. 总结二叉排序树的特点和适用场景,与其他排序方法进行对比;- 教材章节:第三章总结与拓展教学进度安排:1. 第1课时:引入二叉排序树的概念、性质和应用场景;2. 第2课时:讲解二叉排序树的插入、删除、查找操作;3. 第3课时:分析二叉排序树的性能特点;4. 第4课时:介绍二叉排序树在实际应用中的优势;5. 第5课时:结合实例,学生动手实践二叉排序树的构建和操作;6. 第6课时:总结二叉排序树,与其他排序方法进行对比。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计一、引言数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。

该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。

通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力。

数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。

学习数据结构的最终目的是为了获得求解问题的能力。

对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。

实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。

相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,我们都会有不同程度上的提高。

二、课程设计目的本课程是数据结构课程的实践环节。

主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C++或其他语言中应用这些算法的能力。

通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。

三、内容设计要求二叉排序树的实现:用顺序和二叉链表作存储结构1)以回车(‘\n’)为输入结束标志,输入数列L,生成一棵二叉排序树T;2)对二叉排序树T作中序遍历,输出结果;3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。

(一)问题分析和任务定义对问题的描述应避开具体的算法和涉及的数据结构,它是对要完成的任务作出明确的回答,强调的是做什么,而不是怎么做。

(二)详细的设计和编码算法的具体描述和代码的书写。

(三)上机调试源程序的输入和代码的调试。

要求:设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,深刻理解、牢固的掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。

四、源代码1、用二叉链表存储结构实现#include <iostream>using namespace std;typedef int KeyType;typedef struct Node{KeyType key ;struct Node *lchild,*rchild;}BSTNode, *BSTree;void InsertBST(BSTree *bst, KeyType key){BSTree s;if (*bst == NULL)/*递归结束条件*/{s=new BSTNode;s-> key=key;s->lchild=NULL;s->rchild=NULL;*bst=s;}elseif (key < (*bst)->key)InsertBST(&((*bst)->lchild), key);/*将s插入左子树*/ elseif (key > (*bst)->key)InsertBST(&((*bst)->rchild), key); /*将s插入右子树*/}void CreateBST(BSTree *bst){KeyType key;*bst=NULL;scanf("%d", &key);while (key!=0){InsertBST(bst, key);scanf("%d", &key);}}void InOrder(BSTree root) {if (root!=NULL){InOrder(root->lchild);printf("%d ",root->key);InOrder(root->rchild);}}BSTNode * DelBST(BSTree T, KeyType x) {BSTNode *p, *f,*s ,*q;p=T;f=NULL;while(p) /*查找关键字为x的待删结点p*/{if(p->key==x) break;f=p; /*f指向p结点的双亲结点*/if(p->key>x)p=p->lchild;elsep=p->rchild;}if(p==NULL)return T; /*若找不到,返回原来的二叉排序树*/ if(p->lchild==NULL) /*p无左子树*/{if(f==NULL)T=p->rchild;elseif(f->lchild==p)f->lchild=p->rchild ;elsef->rchild=p->rchild ;delete p;}else /*p有左子树*/{q=p;s=p->lchild;while(s->rchild) /*在p的左子树中查找最右下结点*/{q=s;s=s->rchild;}if(q==p)q->lchild=s->lchild ; /*将s的左子树链到q上*/ elseq->rchild=s->lchild;p->key=s->key;delete s;}return T;}void main(){BSTree T;int x;BSTree result;printf("建立二叉排序树,请输入序列L:\n");CreateBST(&T);printf("中序遍历输出序列为:");InOrder(T);cin>>x;result = DelBST(T,x);if (result != NULL){InOrder(result);}elseprintf("无x\n");}2、用顺序存储结构实现#include<iostream>using namespace std;typedef int KeyType;typedef struct Node{KeyType key;struct Node *next;}BSTNode,*BSTree;int A[40]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; int j,i=0;void InsertBST(int A[],KeyType key){int j=0;while(A[j]!=-1){if(key<A[j])j=2*j+1;elsej=2*j+2;}A[j]=key;}void CreateBST(int A[]){int key;scanf("%d", &key);while (key!=-1){InsertBST(A,key);scanf("%d", &key);}}void Traverse(int A[],int i){if(A[i]!=-1){Traverse(A,2*i+1);cout<<A[i]<<'\t';Traverse(A,2*i+2);}}void DelBST(int A[],KeyType x){ for(i=0;i<40;i++)if(A[i]==x)A[i]=-1;}void main(){int x;//int key;printf("建立二叉排序树,请输入序列L:\n");CreateBST(A);printf("中序遍历输出序列为:");Traverse(A,0);cin>>x;if(A[i]!=-1){DelBST(A,x);printf("删除x后中序遍历输出序列为:");Traverse(A,0);}elseprintf("无X\n");}五、测试分析程序运行:1、用二叉链表存储结构实现:2、用顺序存储结构实现:六、总结与体会通过一周的课程设计,对计算机的应用,数据结构的作用以及C++的使用都有了更深的了解。

在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。

当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。

从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不知如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。

通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。

在这段时间里,我遇到过的问题主要就是C语言和C++语言有些混淆,一些用法记不太清楚。

在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。

在程序的调试能力上,无形中得到了许多的提高。

例如:头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。

在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。

相关文档
最新文档