二叉排序树的实现.docx

上传人:王** 文档编号:213066 上传时间:2023-04-16 格式:DOCX 页数:14 大小:48.45KB
下载 相关 举报
二叉排序树的实现.docx_第1页
第1页 / 共14页
二叉排序树的实现.docx_第2页
第2页 / 共14页
二叉排序树的实现.docx_第3页
第3页 / 共14页
二叉排序树的实现.docx_第4页
第4页 / 共14页
二叉排序树的实现.docx_第5页
第5页 / 共14页
二叉排序树的实现.docx_第6页
第6页 / 共14页
二叉排序树的实现.docx_第7页
第7页 / 共14页
二叉排序树的实现.docx_第8页
第8页 / 共14页
二叉排序树的实现.docx_第9页
第9页 / 共14页
二叉排序树的实现.docx_第10页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《二叉排序树的实现.docx》由会员分享,可在线阅读,更多相关《二叉排序树的实现.docx(14页珍藏版)》请在优知文库上搜索。

1、目录1、设计内容22、概要设计21.1 所需模块21.2 功能模块关系图23 .算法描述31 .1模块流程图33 . 2各模块代码41.1.1 1主函数菜单模块 41.1.2 查找模块51.1.3 插入模块51.1.4 中序遍历模块51.1.5 删除模块64 .运行结果及算法分析71 .1运行结果74 . 2算法分析95 .实验心得96 .程序代码107 .参考资料12K设计内容用二叉链表为存储结构1)以回车(n)为输入结束标志,输入数列L,生成一棵二叉排序树T;2)对二叉排序树T作中序遍历,输出结果;3)输入元素X,查找二叉排序树T,假设存在含X的结点,那么删除该结点,并作中 序遍历(执行操

2、作;否那么输出信息“无x .2、概要设计2. 1所需模块根据程序功能,确定所需模块如下:1)主函数菜单模块;2)查找模块;3)插入模块;4)中序遍历模块;5)删除模块.2 . 2功能模块关系图二叉树排序树的实现主函数菜单模块删除艮一中序遍历模块-一插入模块.查找模块图1功能模块图3 .算法描述3.1 模块流程图Main()开始退出程序删除功能删除成功中序遍历功能显示相应的报错、运行结果及相应的界面.3.2.1主函数菜单模块该模块功能主要是给用户提供清楚的可操作界面,易于人机操作.并能很好 的调用其他各模块,使程序更加优化,思路更加清楚,结构更加明了,提升了程 序 的实用性.其算法如下:void

3、 main() node T=NULL;int num;int ch=O;node p=NULL;printf(,please input a list of numbers end with zero:);doscanf(%d,&num);if(!num) printf(you have finished your input!n);else insertBST(&T,num);while(num);printf(nn-the menu of the Opperationn); *主程序菜单*/printf(n 0: exit);printf(n 1: inorder travel the

4、tree);printf(n 2: delete);while(ch=ch)printf(n choose the opperation to continue:);scanf(%d,ch);switch(ch)case O: exit(O); *0退出 */case 1: printf( The result of the inorder traverse is:n );inorderTraverse(fcT); *1 中序遍历*/break;case 2: printf(, Please input the number you want to delete:);scanf(%d,&num

5、); *3删除某个结点 */if(scarchBST(T,num,NULL,(fep)T=Delete(T,num);printf( You have delete the number successfulIy !n );inordcrTraverse(data) (*p=t;retum (1);/*查找成功*/else if(keydata) searchBST(t-lchild,key,t,p);/*在左子树中继续查找*/else searchBST(t-rchild,key,t,p);/*在右子树中继续查找*/)4. 2. 3插入模块在二叉排序树中插入新结点,要保证插入后的二叉树仍符合

6、二叉排序树的定 义.插入过程:假设二叉排序树为空,那么待插入结点*p作为根结点插入到空树中; 当非空时,将待插结点关键字p-item和树根关键字t- item进行比拟,假设 p-item = t- item,那么无须插入,假设p- item item,那么插入到根的 左子 树中,假设p-item t- item,那么插入到根的右子树中.而子树中的插 入过程 和在树中的插入过程相同,如此进行下去,直到把结点*p作为一个新的树 叶插 入到二叉排序树中,或者直到发现树已有相同关键字的结点为止.其算法如 下:insertBST(node *t,int 卜必丫)/*插入函数*/(node p=NULL,

7、s=NULL;if(!searchBST(*l,key,NULL,&p) /*查找不成功*/ s=(node)malloc(sizeof(BSTnode);s-data=key;s-lchild=s-rchild=NULL;if(!p) *t=s;信被插结点*s为新的根结点*/else if(keydata) p-lchild=sj*被插结点*s 为左孩子*/else p-rchild=s; /*被插结点*s 为右孩子*/ return (I);else return (0);/*树中已有关键字相同的结点,不再插入*/)5. 2. 4中序遍历模块遍历(TraVerSal)是指沿着某条搜索路线,

8、依次对树中每个结点均做一次且仅 做一次访问.访问结点所做的操作依赖于具体的应用问题.二叉树共有三个部 分 组成,即根结点,根结点的左子树,根结点的右子树.限定以从左至右方式共 有三种遍历方式,即前序遍历,中序遍历,后序遍历.中序遍历的原那么:假设被遍历的 二叉树为非空,那么依次执行如下操作:a)以中序遍历方式遍历左子树;b)访问根结点;C)以中序遍历方式遍历右子树.其算法如下:inorderTraverse(node *t)/*中序遍历 函数*/if(*t)if(inorderTraverse(lchild)/* 中序遍历根的左子树 */printf(%d ,(*t)-data); /*输出根

9、结点*/if(inorderTraverse(rchild);/*中序遍历根的右子树*/ re(um(l);)6. 2. 5删除模块删除模块:删除结点函数,采用边查找边删除的方式.如果没有查找到,那么不对 树做任何的修改;如果查找到结点,那么分四种情况分别进行讨论: a)该结点左右子树均为空,可以直接进行删除;b)该结点仅左子树为空,右子树不为空,用右子树的根结点取代被删除结 点 的位置;c)该结点仅右子树为空,左子树不为空;d)该结点左右子树均不为空,找到被删除结点右子树中值的最小的结点,并 用该结点取代被删除节点的位置.其算法如下:node Delete(node t,int key) /

10、*删除函数*/ 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)*p指向当前要删除的结点*/ if(q=NULL) t=p-rchild; *q 指向要删结点的父母*/else if(q-lchild=p) q-lchild=p-rchild; *p 为 q 的左孩子*/else q-rchild=prchild;/*

11、P 为 q 的右孩子*/ free(p);else(*p的左孩子不为空*/f=p;s=p-lchild;WhiIe(S-rchild) /*左拐后向右走到底*/f=s;s=s-rchild;if(f=p) f-lchild=s-lchild; 重接 f 的左子树*/else f-rchild=s-lchild;/*重接 f 的右子树*/p-data=s-data;free (s); return t;7. 运行结果及算法分析7.1 运行结果目输入串叔字并以向结束二卫23 * 56 78灯后 尔己经输入莞毕;匚|建输入一车数字舁R,4结束二12 *bb i 18yDri7WWVr7主程序菜单一一

12、乍 r L)6乍槃eO果图4中序排列效果S节:等屣文件夹Debug二叉律序冏的实现.果主程序菜单-一89是数8 7 白BvU T:是:2除 粉作果56作删 罚i操要 个性45个相 a薄-用23-l23怪 州选序选 ;葬12蓼1鼠?8作*个图5删除成成效果 图百锄人车数手并以 S 结来:12兀 叫56关 而 修 你L,纣输八:图6删除不成成效果图4 . 2算法分析假设二叉树有n个结点深度为h,中序遍历算法的时间复杂度为0(n),空间 复杂度为0(h).5 .实验心得课程设计是培养学生综合运用所学知识,发现提出分析和解决实际问题,锻 炼实践水平的重要环节,是对学生实际水平的具体练习和考察过程.回忆数据设 计这些日子,至今我感慨颇多,确实,学到了很多的东西包括以前在课本上没有 学到的知识,还使我懂的了理论和时间结合是很重要通过这次课程设计,我加深了对数据结构这门课程的理解,更好的掌握了各 种二叉数的递归与非递归,树与二叉树的转换.以及树的中序的递归,非递归算 法,层次序的非递归算法的实现,更稳固了自己的C和C+的知识.在老师的指导、书本上和网络上查找资料下,终于把程序编出来,在此非常 感谢老师对我的指导.6 .程序代码#includc# include typedef struct Tnode 产输入的数据*/*结点的左右指针,分别指向结点的左右孩子*/i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 数据结构与算法

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!