用顺序和二叉链表作存储结构实现二叉排序树全代码(共36页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《用顺序和二叉链表作存储结构实现二叉排序树全代码(共36页).doc》由会员分享,可在线阅读,更多相关《用顺序和二叉链表作存储结构实现二叉排序树全代码(共36页).doc(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上安徽新华学院数据结构课程设计报告题目:用顺序和二叉树存储结构实现二叉树排序 学院:信息工程 专业:信息与计算科学 班级:12信科本一班 姓名:李智 学号: 指导教师:李明 设计时间: 2013-12-16至2013-12-30 课程设计任务书一 设计任务研究关于如何创建二叉排序树并对树进行遍历,查找和删除等操作,同时关注用顺序和二叉链表作存储结构带来的区别。二 设计要求(1). 利用顺序存储和链式存储两种算法计算实现二叉搜索树的创建。(2). 利用顺序存储和链式存储两种算法计算实现中序遍历。(3). 利用顺序存储和链式存储两种算法计算实现查找结点。(4). 利用顺序存
2、储和链式存储两种算法计算实现删除结点。三 设计期限2013-12-16至2013-12-30前言数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。本课程设计中的二叉排序树,可以用顺序存储和链式存储两种算法计算。本课程设中的二叉排序树,一共要实现四项基本的功能。它们分别是二叉搜索树的创建、中序遍历、查找结点和删除结点。二叉树是树形结构的一个重要的类型,二叉树是n(n=0)个结点的有限集,它或者是空集(n=0),或者由个根结点及两棵互不相交的、分别称作这个根的左子树和右子树的二叉树组成。 二叉树的存储结构和算法比较简单,特别适合计算机处理。即使一般形式的
3、树也可简单的转换为二叉树。二叉树的顺序存储结构是把二叉树的所有结点,按照一定的次序顺序,存储到一片连续的存储单元中。遍历二叉树就是沿某有前序遍历、中条搜索路径周游二叉树,对树中每个结点访问一次且仅访问一次。在遍历方案中主要序遍历、后序遍历。 现实中有许多应用到二叉树的例子,所以我们要把理论与现实结合起来。在学习中主要掌握怎么求二叉树的高度、叶子结点个数、总结点个数以及熟练三种遍历的方法。目 录2. 5 总体设计流程图3 专心-专注-专业1 需求分析1.1 问题的提出 研究关于如何创建二叉排序树并对树进行遍历,查找和删除等操作,同时关注用顺序和二叉链表作存储结构带来的区别。1.2任务与分析 用顺
4、序和二叉链表作存储结构实现二叉排序树:(1)以回车(n)为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。2 总体设计2.1二叉排序树的建立建二叉树的结点至少应当包含三个域,分别存放结点的数据data,左子女结点指针leftChild和右子女结点指针rightChild。整个二叉树的链表要有一个表头指针,它指向二叉树的根结点,其作用是当作树的访问点从空的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。根据二叉排序树的
5、定义,建立一棵二叉排序树的过程是按照待排序序列元素的先后次序,不断动态生成二叉树的结点,逐个插入到二叉树中。若p为根结点指针,b为当前待插入元素,其过程可以描述为:若为空树(p=nil),动态生成一个结点,其数据域为当前待插入元素b,左、右指针域为“空”,p指向该结点。若非空树,比较b与根结点数据data(p)如果bdata) *p=t;return (1); else if(keydata) searchBST(t-lchild,key,t,p); else searchBST(t-rchild,key,t,p); insertBST的声明 insertBST(node *t,int key
6、) node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p) s=(node)malloc(sizeof(BSTnode); s-data=key; s-lchild=s-rchild=NULL; if(!p) *t=s; else if(keydata) p-lchild=s; else p-rchild=s; return (1); else return (0); inorderTraverse类的声明inorderTraverse(node *t) if(*t) if(inorderTraverse(&(*t)-lchild) printf(%
7、d ,(*t)-data); if(inorderTraverse(&(*t)-rchild); return(1) ; Delete类的声明node Delete(node t,int key) node p=t,q=NULL,s,f; while(p!=NULL) if(p-data=key) break; q=p; if(p-datakey) p=p-lchild; else p=p-rchild; if(p=NULL) return t; if(p-lchild=NULL) if(q=NULL) t=p-rchild; else if(q-lchild=p) q-lchild=p-rc
8、hild; else q-rchild=p-rchild; free(p); else f=p; s=p-lchild; while(s-rchild) f=s; s=s-rchild; if(f=p) f-lchild=s-lchild; else f-rchild=s-lchild; p-data=s-data; free (s); return t;3.1 中序遍历模块系统将提示用户输入新添加的数据,输入结束后进行中序遍历关键代码: inorderTraverse(node *t) /*中序遍历函数*/ if(*t) if(inorderTraverse(&(*t)-lchild) /*
9、中序遍历根的左子树*/ printf(%d ,(*t)-data); /*输出根结点*/ if(inorderTraverse(&(*t)-rchild); /*中序遍历根的右子树*/ return(1) ;3.2 删除模块系统将对用户输入的数进行查找,查找到之后删除此数,并对全部数据进行中序遍历。关键代码:node Delete(node t,int key) /*删除函数*/ node p=t,q=NULL,s,f; while(p!=NULL) /*查找要删除的点*/ if(p-data=key) break; q=p; if(p-datakey) p=p-lchild; else p=
10、p-rchild; if(p=NULL) return t; /*查找失败*/ if(p-lchild=NULL) /*p指向当前要删除的结点*/ if(q=NULL) t=p-rchild; /*q指向要删结点的父母*/ else if(q-lchild=p) q-lchild=p-rchild; /*p为q的左孩子*/ else q-rchild=p-rchild;/*p为q的右孩子*/ free(p); else /*p的左孩子不为空*/ f=p; s=p-lchild; while(s-rchild) /*左拐后向右走到底*/ f=s; s=s-rchild; if(f=p) f-lc
11、hild=s-lchild; /*重接f的左子树*/ else f-rchild=s-lchild; /*重接f的右子树*/ p-data=s-data; free (s);return t;4编码与调试首先进入VC+6.0,打开工程zjr.dsw,然后进入源程序,也可以不打开工程,直接双击zjr文件夹下的zjr.exe文件即可运行程序。4.1 顺序存储图7.1.1 打开程序,成功显示提示信息图7.1.2 输入数据,以0结束输入,操作成功图7.1.3 功能1:中序输出数据,操作成功图7.1.4 功能2:删除数据,显示提示信息,操作成功图7.1.5 删除数据,操作成功图7.1.6 重复执行程序,
12、操作成功4.2 二叉链表存储图7.2.1打开程序,显示提示信息,操作成功图7.2.2功能1:输入数据,进行中序遍历,操作成功图7.2.3功能2:输入数据,进行删除,操作失败,因为没有此数据,显示 错误信息图7.2.4功能2:输入数据,进行中序遍历,操作成功通过上述测试,本系统实现了二叉树的生成,中序遍历,查找删除功能,能避免数据的输入错误等。验证结果正确,说明其符合算法设计的要求:(1)正确性、可读性、健壮性、效率与低储存量需求.要写一个优质的算法,就必须考虑其时间复杂度(它表示随问题的规模n的增大,算法执行时间的增长率和f(n)的增长率相同)和空间复杂度。遍历二叉树的算法中的基本操作是访问结
13、点,则不论按哪一次次序进行遍历,对含n个结点的二叉树,其时间复杂度都为O(n)。所需空间为遍历过程中栈的最大容量,即树的深度,最坏情况下为n,则空间复杂度也为O(n)。5 总结这次课程设计使我对数据结构认识深刻了许多,其中最深刻的是我理解了用二叉链表结构存储实现二叉排序树,同时也加深了对二叉树的理解。本课程设计实现了二叉排序树的创建、中序遍历、删除二叉排序树中某个结点,。在进行搜索时,还可以采用更好的搜索结构即动态搜索结构。当没有找到时,可以将其插入,而不是仅仅提示未找到。通过这一次的课程设计,我已经会用二叉链表存储结构实现对二叉排序树的的创建,中序遍历,查找和某个删除结点等基本操作。但我同时
14、也发现了自己许多不足之处 。首先,对数据结构的掌握还不够。虽然完成了程序,但是只用到了基本的结点以及链表,在数据结构的选择上避重就轻,覆盖面较小,不能很好的体现各种数据结构的掌握度,同时也缺少了适当的锻炼,在这方面还需要自己主动去提高。其次,在程序整体的设计上还不够完善,各模块可以适当增加内容,界面还可以更加的人性化些,这样整个程序才具有更强的美观性与实用性。总而言之,这次课程设计给了我很大启发,我明白了,不管遇到什么问题,只要抓住根源,不气馁,从不同方面去攻破它,终究会成功,生活也是如此。在今后的工作、学习中我将认真总结经验教训,努力使自己成为一名技术过硬、工作严谨、思维活跃的工程人员,为提
15、高人们的生活质量做出更大的贡献。心得体会课程设计结束了,在这次的课程设计中不仅检验了我所学的知识,也培养了我如何去把握一件事情,如何去做一件事情,课程设计是我们专业课程知识综合应用的实践训练是我们迈向社会,从事职业工作前一个必不可少的过程。我这次设计的科目是数据结构,数据结构,是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。这次通过对二叉排序树的深入研究,我又一次的温习了c,c+和数据结构的有关知识,尽管这中间经历好多困难,但我通过查找多种资料,利用网络优势,完成了任务。我这次课程设计代
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 二叉 链表作 存储 结构 实现 二叉排序树 代码 36
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内