当前位置:文档之家› 数据结构课程设计--二叉排序树

数据结构课程设计--二叉排序树

数据结构课程设计--二叉排序树
数据结构课程设计--二叉排序树

数据结构课程设计--二叉排序树

成绩: __________课程设计(数据结构)

院、系计算机与软件学院专业软件工程

姓名学号

指导教师

二零一二年十二月二十五日

目录

1.绪论 (1)

2.课程设计 (2)

2.1课程设计目的 (2)

2.2课程设计要求 (2)

3.课程实验内容 (2)

3.1普通二叉排序树的插入,删除 (2)

3.2按递增顺序插入N个整数,并按同样顺序删除 (4)

3.3按递增顺序插入N个整数,并按相反顺序删除 (4)

3.4按随机顺序插入N个整数,并按随机顺序删除 (4)

4.课程设计实验结果 (6)

4.1课程实验数据 (6)

4.2实验操作效率比较图 (6)

I

二叉排序树

魏麟祥

南京信息工程大学计算机与软件学院,南京 210044

摘要:本文主要是对二叉排序树的操作效率进行探讨,先从二叉排序树的定义来进行分析,然后分析其主要的性质。通过对其性质的分析,让人们了解二叉排序树的运行。从理论上分析二叉排序树的创建、删除、插入以及遍历,运用C 语言算法编程实现对普通二叉排序树制定操作,通过普通二叉排序树对实例的运行时间来判断普通二叉排序树的运行效率。

关键词:二叉排序树;C语言;随机函数

1.绪论

通过对数据结构的不断学习,对二叉排序树有了一定的了解。在教材中,只是从理论上说明了二叉排序树的定义及其效率,并没有用具体算法的在计算机上实现。就此问题,本文在其理论的基础上给出了具体的算法。利用普通二叉排序树的定义,为了更详细的描述二叉排序树的算法,文章采用C语言来编程实现。该算法主要描述二叉排序树的建立,删除,插入以及遍历等操作。通过分别测试3类数据来直观的表现出普通二叉排序树的运行效率。

2.课程设计

2.1课程设计目的

掌握了解二叉排序树插入删除的效率,通过合作写程序提高自己的设计能力和测试的能力。在写程序的时候能了解自己的不足,提高自己解决问题的能力。

2.2课程设计要求

对普通二叉排序树实现定制操作,分析这一数据结构对应的插入和删除操作效率。要求对N个不同整数进行下列操作:(1)按递增顺序插入N个整数,并按同样顺序删除;(2)按递增顺序插入N个整数,并按相反顺序删除;(3)按随机顺序插入N 个整数,并按随机顺序删除;要求N从1000到10000取值,并以数据规模N为横轴,运行时间为纵轴,画出3种不同数据结构对应的操作效率比较图。

3.课程实验内容

3.1普通二叉排序树的插入,删除

Status Insert(BiTree &T,int e){

i f(!Search(T,e,NULL,p)){ //查

找不成功

s=(BiTree)malloc(sizeof(BiTNode));

s->data=e;s->lchild=NULL;s->rch ild=NULL;

if(!p)T=s; //被插结点*s为新的根结点

else if(edata)p->lchild=s; // 被插结点*s为左孩子

else p->rchild=s; // 被插结点*s为右孩子

return ok;}else return false;}

Status DeleteBST(BiTree &T,int key){

//若二叉排序树T存在关键字等于key的数据元素时,则删除该数据元素结点

i f(!T)return false;

e lse {

if(key==T->data)return Delete(T);

else if(keydata)return DeleteBST(T->lchild,key);

else return DeleteBST(T->rchild,key);

}

}

3.2按递增顺序插入N个整数,并按同样顺序删除

Status CreateBiTree(BiTree &T,int n){

i nt i;T=NULL;for(i=0;i

void Dele(BiTree &T,int m,int n){int i;int key;

for(i=0;i

3.3按递增顺序插入N个整数,并按相反顺序删除

void Dele(BiTree &T,int m,int n){

i nt i;int key;

f or(i=n-1;i>=n-m;i--){key=i;DeleteBST(T

,key);}} //按照相反顺序删除M个整数

3.4按随机顺序插入N个整数,并按随机顺序删除

void Rand(BiTree &T,int n,int a[]){ //返回一随机数值,范围在0至RAND_MAX 间

i nt j,p,i=0;srand((unsigned)time(NULL));

//设置随机种子

f or(i=0;i

for(j=0;j

i f(j>=i)a[i]=p;else{i--;continue;}}

f or(i=0;i

Status CreateBiTree(BiTree &T,int n,int a[]){

R and(T,n,a);int i;T=NULL;

f or(i=0;i

Insert(T,a[i]);} //随机输入不同的整数

r eturn ok;

}

void Dele(BiTree &T,int m,int n,int a[]){

i nt i;int key;

f or(i=0;i

DeleteBST(T,a[i]);}

}

4.课程设计实验结果

4.1课程实验数据

要求N从1000到10000取值,测试3种数据

结构的运行时间,通过Microsoft Visual C++中配

置文件的计时功能测试。

时间单位:毫秒

个数N10002000300040005000600070008000同顺序删除92.005275.934547.312887.7761310.0321809.5282407.2573054.456反顺序删除140.025445.191923.4331567.1932394.6293359.7084457.3945767.839随机删除117.063270.571437.634610.964801.0811235.9241465.5811564.223个数N900010000

同顺序删除3801.8194647.078

反顺序删除7231.9568925.636

随机删除1872.2862800.354

4.2实验操作效率比较图

根据4.1中的数据绘图,以数据规模N为横轴,

运行时间为纵轴制作3种数据结构的操作效率比较

图。

参考文献

[1]严蔚敏吴为民.《数据机构》.清华大学出版社,1997.4

[2]李含光郑关胜.《C语言程序设计教程》.清华大学出版社,2011.1

[3]程晓旭张海.《C语言算法速查手册》.人民邮电出版社,2009.10

[4] 汪沁奚李峰.《数据结构》.清华大学出

版社,2009.9

数据结构二叉排序树的实现(用顺序和二叉链表作存储结构)课程设计

一、设计题目 1、题目:二叉排序树的实现 (用顺序和二叉链表作存储结构 ) 2、要求(功能): 1) 以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; 2) 对二叉排序树T作中序遍历,输出结果; 3) 输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”; 二、需求分析 建立排序二叉树,主要是建立节点来存储输入的数据,需要建立函数来创造排序二叉树。 该题目包括三方面的容:一个是二叉排序树的建立,而是二叉树的中序遍历,三是二叉树元素的查找并删除。 三、数据结构设计 在写算法之前,应对数据结构进行设计。本体主要会用到指针变量,插入节点函数和建立二叉树,以及中序遍历函数,还有一些输入输出语句。 四、算法设计 算法设计思想

二插链表作存储结构:建立二插排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论:1、该结点左右子树均为空;2、该结点仅左子树为空;3、该结点仅右子树为空;4、该结点左右子树均不为空。 在进行算法设计时,应将题目分为五个函数模块: 1、中序遍历,符合升序输出 void inorder(node *&root) { if(root!=NULL) { inorder(root->left); cout<data<<' '; inorder(root->right); } }

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

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

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩3项),对比查找效率,并说明 为什么二叉排序树效率高(或者低)。 2. 函数模块: 2.1.主函数main模块功能 1.通过bstree CreatTree()操作建立二叉排序树。 2.在二叉排序树t过操作bstree InsertBST(bstree t,int key,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 compare()对数组和二叉排序树的查找效率进行比较比 较。 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插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

数据结构课程设计(内部排序算法比较_C语言)

数据结构课程设计 课程名称:内部排序算法比较 年级/院系:11级计算机科学与技术学院 姓名/学号: 指导老师: 第一章问题描述 排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。

第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。 (2)选择2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

课程设计二叉树

安徽理工大学 数据结构 课程设计说明书题目: 二叉树的遍历集成 院系:计算机科学与工程学院 专业班级: 学号: 学生姓名: 指导教师: 2015年 01 月 9 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院信息安全教研室 2014年 12 月 18 日

目录 1.需求分析 (1) 2、总体设计 (1) 2.1 程序目录 (1) 2.2 算法流程 (3) 3、详细设计 (3) 3.1 界面设计 (3) 3.2 详细代码设计 (5) 3.3 调试分析 (10) 4、总结 (15) 参考文献 (16) 代码详述 (16)

1.需求分析 “数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心,而且也成为其他理工类学科必修课程,所谓”数据结构”是相互之间存在一种或多种特定关系的数据元素的集合.数据元素之间的相互关系成为结构,结构一般有线性结构,树形结构,图状结构,本程序所做的就是树形结构的二叉树的遍历算法和线索化查找. 本程序使用VC6.0++编写,具体实现功能有二叉树的遍历,包括先序遍历,中序遍历,后序遍历的递归算法以及非递归算法.另外本程序还有可线索化二叉树的功能,由此可以得到二叉树某个节点的前驱和后继. 题目要求为: 1.实现二叉树的各种遍历。包括先序遍历、中序遍历、后序遍历的递归和非递归算法、以及层次遍历。 2.要求能查找任一结点在某种遍历序列中的前驱和后继。 3.界面友好,易于操作。可采用菜单或其它人机对话方式进行选择。 由小组一起制作,本人做小组汇总工作,并在基础上加了查找某个节点是否存在二叉树,以及求二叉树总节点数等一些简单功能 2、总体设计 2.1 程序目录 (1)typedef struct node 二叉树的定义,包含数据域data,左孩子lchild,右孩子rchild,若二叉树为空,则头结

数据结构课程设计AVL树实现及其分析实验报告

算法与数据结构 课程设计报告 题目: A VLree的实现及分析 班级: 12计算机1 学号: 1200303132 姓名: 熊成毅 成绩: 2013年12月31日

一、AVLree的实现及分析 AVL 树是平衡的二元查找树。一株平衡的二元查找树就是指对其每一个节点,其左子树和右子树的高度只差不超过1. 编写程序实现AVL树的判别;并实现AVL树的ADT,包括其上的基本操作;节点的加入和删除。BSt和AVL的差别就在平衡性上,所以AVL的操作关键要考虑如何在保持二元查找树定义条件下对二元树进行平衡化。 (1)编写AVL树的判别程序,并判别一个人元查找数是否为AVL树。二元查找树用其先序遍历结果表示,如:5,2,1,3,7,8. (2)实现AVL树的ADT,包括其上的基本操作:节点的加入和删除,另外包括将一般二元查找树转变为AVL树的操作。 二、设计思想(宋体,三号加粗) 任意给定一组数据,设计一个算法,建立一棵平衡二叉树,对它进行查找、插入、删除等操作。平衡二叉树ADT结构如下: typedef struct{ Status key; }ElemType; typedef struct BSTNode{ ElemType data; Status bf; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; 给出一组数据,通过 InsertAVL(BSTree &T, ElemType e, Status &taller)插入算法,构建平衡二叉树,若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。 在此算法中,利用到递归算法和 LeftBalance(BSTree &T)左平衡处理,RightBalance(BSTree &T)右平衡处理。进而实现构建平衡二叉树,使其左子树和右子树的高度之差不超过1. LeftBalance(BSTree &T)对以指针T所指结点为根的二叉树作左平衡旋转处理。本算法结束时,指针T指向新的根结点。 RightBalance(BSTree &T)// 对以指针T所指结点为根的二叉树作右平衡旋转处理。本算法结束时,指针T指向新的根结点。 R_Rotate(BSTree &p)对以*p为根的二叉排序树作右旋处理,处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点 L_Rotate(BSTree &p)对以p↑为根的二叉排序树作左旋处理,处理之后p指向新的树

数据结构二叉排序树实验报告

实验报告 课程名:数据结构(C语言版)实验名:二叉排序树 : 班级: 学号: 撰写时间:2014.12.18

一实验目的与要求 1.掌握二叉排序树上进行插入和删除的操作 2.利用C 语言实现该操作 二实验内容 ?对于一个线形表, 利用不断插入的方法, 建立起一株二叉排序树 ?从该二叉排序树中删除一个叶子节点, 一个只有一个子树的非叶子节,一个有两个子树的非叶子节点。 三实验结果与分析 #include #include //二叉查找树结点描述 typedef int KeyType; typedef struct Node { KeyType key; //关键字 struct Node * left; //左孩子指针 struct Node * right; //右孩子指针 struct Node * parent; //指向父节点指针 }Node,*PNode;

//往二叉查找树中插入结点 //插入的话,可能要改变根结点的地址,所以传的是二级指针void inseart(PNode * root,KeyType key) { //初始化插入结点 PNode p=(PNode)malloc(sizeof(Node)); p->key=key; p->left=p->right=p->parent=NULL; //空树时,直接作为根结点 if((*root)==NULL){ *root=p; return; } //插入到当前结点(*root)的左孩子 if((*root)->left == NULL && (*root)->key > key){ p->parent=(*root); (*root)->left=p; return; } //插入到当前结点(*root)的右孩子 if((*root)->right == NULL && (*root)->key < key){ p->parent=(*root);

数据结构课程设计-排序

一、问题描述 1、排序问题描述 排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。 本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。其中包括: (1)插入排序的有关算法:不带监视哨的直接插入排序的实现; (2)交换排序有关算法:冒泡排序、快速排序的实现; (3)选择排序的有关算法:直接选择排序、堆排序的实现; (4)归并排序的有关算法:2-路归并排序的实现。 2、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。 二、问题分析 本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。 冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。 冒泡排序的步骤: 1)置初值i=1; 2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j] 与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置; 3)i=i+1; 4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止; 要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。 快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。 快速排序步骤: 1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下

二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计 名称 二叉排序树运算学生姓名顾成方 学号0704011033 专业班级08计科(2) 指导教师王昆仑张贯虹 2010 年 5 月

题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。 ⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。 一、问题分析和任务定义 本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。 实现本程序需要解决以下几个问题: 1、如何构造二叉排序树。 2、如何通过中序遍历输出二叉排序树。 3、如何实现多种查找。 4、如何实现插入删除等操作。 二叉排序树的定义:

⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。 ⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。 ⑶其左右子树也分别为二叉排序树。 本问题的关键在于对于二叉排序树的构造。根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。因此,插入算法还要包括对数据的查找判断过程。 本问题的难点在于二叉排序树的删除算法的实现。删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确

最小生成树数据结构课程设计报告

河北科技大学 课程设计报告 学生姓名:白云学号:Z110702301 专业班级:计算机113班 课程名称:数据结构课程设计 学年学期: 2 01 3—2 014学年第2学期指导教师:郑广 2014年6月

课程设计成绩评定表

目录 一、需求分析说明 (1) 1.1最小生成树总体功能要求 (1) 1.2基本功能 (1) 1.3 模块分析 (1) 二、概要设计说明 (1) 2.1设计思路 (1) 2.2模块调用图 (2) 2.3数据结构设计 (2) 2.3.1.抽象数据类型 (2) 2.3.2方法描述 (2) 三、详细设计说明 (3) 3.1主函数模块 (3) 3.2邻接表输出子模块 (3) 3.3邻接矩阵输出子模块 (3) 3.4创建邻接矩阵子模块 (3) 3.5创建邻接表子模块 (3) 3.6 Prim子模块 (3) 3.7 Kruscal子模块 (4) 四、调试分析 (4) 4.1实际完成情况说明 (4) 4.2 出现的问题及解决方案 (4) 4.3程序中可以改进的地方 (4) 六、课程设计总结 (7) 七、测试数据 (7) 八、参考书目 (7)

一、需求分析说明 1.1最小生成树总体功能要求 在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种。求解算法多种。 1.2基本功能 在n个城市之间建设网络,只需要架设n-1条线路,建立最小生成树即可实现最经济的架设方法。 程序可利用克鲁斯卡尔算法或prim算法生成最小生成树。 1.3 模块分析 主模块:用于生成界面和调用各个子模块。 Kruscal模块:以kruscal算法实现最小生成树。 Prim模块:以prim算法实现最小生成树。 邻接表模块:用邻接表方式存储图。 邻接表输出模块:输出邻接表。 邻接矩阵模块:用邻接矩阵方式存储图。 邻接矩阵模块:输出邻接矩阵。 二、概要设计说明 2.1设计思路 问题的解决分别采用普利姆算法以及克鲁斯卡尔算法。 1) 普利姆算法就是先选择根,把它放入一个集合U中,剩余的顶点放在集合V中。然后选择该顶点与V中顶点之间权值最小的一条边,以此类推,如果达到最后一个则返回上一个顶点。 2) 克鲁斯卡尔算法就是写出所有的顶点,选择权最小的边,然后写出第二小的,以此类推,最终要有一个判断是否生成环,不生成则得到克鲁斯卡尔的最小生成树。

数据结构课程设计排序实验报告

《数据结构》课程设计报告 专业 班级 姓名 学号 指导教师 起止时间

课程设计:排序综合 一、任务描述 利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 要求:根据以上任务说明,设计程序完成功能。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)随机生成N个整数,存放到线性表中; (2)起泡排序并计算所需时间; (3)简单选择排序并计算时间; (4)希尔排序并计算时间; (5)直接插入排序并计算所需时间; (6)时间效率比较。 2、数据对象分析 存储数据的线性表应为顺序存储。 三、数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列*\n"); printf(" *2:进行删除操作

*\n"); printf(" *3:退出*\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果 (3)中序遍历模块 void view(LNode p){

大数据结构课程设计-最小生成树

《数据结构》期末课程设计 题目第8题:最小生成树问题学院计算机学院 专业 班别 学号 姓名陈聪 2015年7月6日

一、需求分析 1、问题描述 若要在n个城市之间建设通讯网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通讯网,是一个网的最小生成树问题。 2、基本要求 (1)利用克鲁斯卡尔算法求网的最小生成树。 (2)实现并查集。以此表示构造生成树过程中的连通分量。 (3)以文本形式输出生成树中各条边以及他们的权值。 3、实现提示 通讯线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机数函数产生。 图的存储结构的选取应和所作操作向适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组即边集数组表示图。 二、详细设计 根据课设题目要求,拟将整体程序分为三大模块,分别是:图的存储结构,并查集的实现,克鲁斯卡尔算法的实现。 1、边集数组的类型定义: typedef struct { int x, y; int w; }edge; x表示起点,y表示终点,w为权值。 2、并查集功能的实现由以下函数实现: Make_Set(int x)初始化集合; Find_Set(int x) 查找x元素所在的集合,回溯时压缩路径; Union(int x, int y, int w)合并x,y所在的集合。

3、克鲁斯卡尔算法的实现 该算法的实现位于主函数中: qsort(e, n, sizeof(edge), cmp); //将边排序 printf("最小生成树的各条边及权值为:\n"); for (i = 0; i < n; i++) { x = Find_Set(e[i].x); y = Find_Set(e[i].y); if (x != y ) { printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w); Union(x, y, e[i].w); } } 4、设计中还包含以下函数: (1)/* 比较函数,按权值(相同则按x坐标)非降序排序*/ int cmp(const void *a, const void *b) { if ((*(edge *)a).w == (*(edge *)b).w) { return (*(edge *)a).x - (*(edge *)b).x; } return (*(edge *)a).w - (*(edge *)b).w; } (2)快排函数qsort,包含在stdlib.h头文件里 qsort(e, n, sizeof(edge), cmp); (3)C语言提供的随机数函数srand( unsigned int seed ); 使用随机数函数如下: srand( (unsigned)time( NULL ) ); for( i = 0; i < n;i++ )

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

数据结构课程设计二叉树遍历查找

课程设计任务书 2011 —2012 学年第一学期 电子与信息工程系计算机专业09计算机一班班级 课程设计名称:数据结构课程设计 设计题目:排序二叉树的遍历 完成期限:自2012 年 1 月 2 日至2012 年 1 月 6 日共 1 周 设计依据、要求及主要内容(可另加附页): 一、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 二、设计要求 (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务; (2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩; (3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表; (4)认真编写课程设计报告。 三、设计内容 排序二叉树的遍历(用递归或非递归的方法都可以) 1)问题描述 输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。 2)基本要求 (1)用菜单实现 (2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。 四、参考文献

1.王红梅.数据结构.清华大学出版社 2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社 #include using namespace std; int num; //-----------排序二叉树节点--------------// struct tree //定义二叉树节点结构 { int data; //节点数据域 tree *right,*left; //右,左子树指针 }; //-----------排序二叉树类----------------// class Btree { tree *root;//根节点 public: Btree()

数据结构课程设计(附代码)

上海应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 姓名学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计内容说明 1. 项目一 (1) 对设计任务内容的概述 学生成绩管理** 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面

(3) 程序流程图 (4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数中通过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

二叉树数据结构课程设计

目录 第一章需求分析 (1) 1.1课程设计题目 (1) 1.2 课程设计任务及要求 (1) 1.21 课程设计目的 (1) 1.22设计要求 (1) 1.3课程设计思想 (2) 1.4软件运行环境及开发工具 (2) 第二章概要设计 (3) 2.1 数据结构 (3) 2.2 所用方法及其原理说明 (3) 第三章详细设计 (4) 3.1详细设计方案 (4) 3.2 模块设计 (4) 3.21二叉树定义 (4) 3.22 树状显示二叉树设计 (7) 3.22 主函数设计 (10) 第四章调试和操作说明 (11) 4.1 调试 (11) 4.2 操作说明 (12) 第五章总结与体会 (12) 5.1本文的主要工作 (12) 5.2 存在问题 (12) 5.3心得体会 (12) 致谢 (13) 参考文献 (14)

第一章需求分析 1.1课程设计题目 树状显示二叉树: 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出; 第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。 第二层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。 …… 第i层:第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i-1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。 [实现提示] 利用二叉树的层次遍历算法实现。利用两个队列Q,QI。队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。当节点被加入到Q时,相应的打印信息被存到QI中。二叉树本身采用二叉链表存储。 1.2 课程设计任务及要求 1.21 课程设计目的 据结构是计算机专业的核心课程,是一门实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。 1.22设计要求 1、课程设计题目每组一题,每个学生必须独立完成; 2、课程设计时间为2周; 3、设计语言C(C++)不限; 1

北邮数据结构实验—二叉排序树

数据结构 实 验 报 告 实验名称:______二叉排序树___________ 学生姓名:____________________ 班级:_______________ 班内序号:_______________________ 学号:________________ 日期:________________

1.实验要求 根据二叉排序树的抽象数据类型的定义,使用二叉链表实现一个二叉排序树。 二叉排序树的基本功能: 1.二叉排序树的建立 2.二叉排序树的查找 3.二叉排序树的插入 4.二叉排序树的删除 5.二叉排序树的销毁 6.其他:自定义操作编写 测试main()函数测试二叉排序树的正确性 2. 程序分析 2.1 存储结构 二叉链表 2.2 程序流程(或程序结构、或类关系图等表明程序构成的内容,一般为流程图等) 2.2.1.

2.2.2.伪代码 1.从文件读取待建树元素 2.建树,若待插入元素比根节点小,向左子树前进并重复比较左子树根节点,若待插入元素比根节点大,向右子树前进并重复比较右子树根节点,直至找到空节点则插入该元素,不断插入直至不剩下元素。 3.用户选择操作。 4.若用户选择查找,则现由用户输入待查找数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至关键码相等,则输出节点情况。 5.若用户选择插入,则现由用户输入待插入数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至到空节点,则插入该元素。 6.若用户选择删除,则现由用户输入待删除数值。从根节点开始比较,若较小则移至左子树,若较大则移至右子树,直至关键码相等; 1).若该节点为叶子节点,则直接删除; 2).若该节点无左子树,则其双亲节点直接与其右子树根节点连接,再删除该节点; 3).若该节点有左子树,则其左子树的最右节点数值直接覆盖该节点数值,再删除最后节点。 7.若用户选择销毁,则不断执行删除操作直至不剩余节点。 8.若用户选择退出,则程序结束。 2.3 关键算法分析 关键代码即删除操作,代码如下: void Delete(BiNode* &R) { BiNode* q=new BiNode; BiNode *s=new BiNode; if(R->lch==NULL){ q=R; R=R->rch; delete q;} else if(R->rch==NULL){ q=R; R=R->lch; delete q; } else{ q=R; s=R->lch; while(s->rch!=NULL) { q=s; s=s->rch;} R->data=s->data; if(q!=R)

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

数据结构课程设计 一、引言 数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力。 数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。 实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,我们都会有不同程度上的提高。 二、课程设计目的 本课程是数据结构课程的实践环节。主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C++或其他语言中应用这些算法的能力。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。

三、内容设计要求 二叉排序树的实现: 用顺序和二叉链表作存储结构 1)以回车(…\n?)为输入结束标志,输入数列L,生成一棵二叉排序树T; 2)对二叉排序树T作中序遍历,输出结果; 3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 (一)问题分析和任务定义 对问题的描述应避开具体的算法和涉及的数据结构,它是对要完成的任务作出明确的回答,强调的是做什么,而不是怎么做。 (二)详细的设计和编码 算法的具体描述和代码的书写。 (三)上机调试 源程序的输入和代码的调试。 要求:设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,深刻理解、牢固的掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。 四、源代码 1、用二叉链表存储结构实现 #include using namespace std;

相关主题
文本预览
相关文档 最新文档