二叉排序树的应用(基于二叉排序树的个人通信录)

     在日常生活中,个人通信录是我们不可少的,不管是纸式的个人通信录 还是我们手机中的个人通信录,查寻是其最基本的操作,几乎所有的操作都是在查寻的基础上进行的,所以,查寻时间的快慢很大程度上决定了整个通信录的性能。所以,一个有着良好界面、查寻速快的通信录,是人们所追求的。

本设计应用折半查寻法 的技术思想进行查寻,从本思想出发,可以有两种数据组织方式:一是应用链表进行组织数据,由于折半查寻法的特殊性,所要进行查寻的数据列必须是有序的数据列,这样要求对数据列进行排序。出于系统实时查寻的考虑,每次对通信录进行改变后都得进行重新排序,这样才能保证数据列是实时有序的。这样当操作量大时,排序所消耗的时间对整个系统有很大的影响。

二是应用二叉排序树来组织数据,由于二叉排序树是应用折半查寻法思想进行对数据进行存储的,所以,其左孩子大于双亲结点、右孩子小于双亲结点(或者左孩子小于双亲结点、右孩子大于双亲结点),这样就可以应用折半查寻法的思想进行查寻,从而减少对排序时所消耗的时间。

本设计采用第二种方法,即应用二叉排序树进行组织数据,在此基础上进行对个人通信录的各种操作。由于删除操作是本设计的重点,删除操作的成功与否直接影响到整个系统的成败,所以在此进行详细分析一下删除操作的实现。

此功能函数主要应用于删除将要进行删除的记录,此操作较其它几个操作难一点,同时也是此次设计的重点,所以,本函数的成败可以直接影响到本次设计的成败,同时,在进行二叉排序树进行组织时,如果不从系统的整体进行考虑,只想到简单地实现删除功能,将会出现错误。

在设计初期,由于没有考虑所有可能的情况,所以在进行删除最后一个结点时,总会出现内存不能引用的错误。最后想到应用浪费一个结点空间的技术进行处理此问题,就是根结点用来保存二叉排序树的某些信息,而不保存记录,与我们单链表中的头结点一样,这样做解决了上面所说的问题,同时在进行查寻双亲结点时也带来了很大的方便。

有关二叉排序树的删除的有关问题,请读者参考相关的参考文献 ,在此不再进行说明,本节重点在于说明本课程设计中有关删除的问题。

在本设计中,删除的首要条件是找到将要进行删除结点的双亲结点,由于根结点不用于存储记录,所以,可以不用进行判断根结点的情况,进行查寻双亲结点时,从根结点开始,首先进行判断根结点的左右子树是否为空,如果根结点的左右子树为空,则返回 NULL ,如果根结点的左子树(右子树)不为空,则将其左子树(右子树)的记录的学号与将要进行删除的学号进行比较,如果相等,则返回根结点;否则进行比较,如果左子树(右子树)不为空,且左子树(右子树)的学号大于(小于)要进行删除的学号,则进行递归在左子树(右子树)中进行查寻,直到查寻到或者当前结点的左右子树为空时结束。如果当前结点的学号与要进行删除的学号不相等,且当前结点的左右子树为空,则返回空,结束查寻过程。

经过对双亲结点的查寻,如果没有此记录,则进行提示,否则进行删除操作 [1] [5] ,在进行删除时,有以下几种可能,以下操作中假设每次把要进行删除结点进行删除后,同时也释放了此结点所占用的内存空间,防止内存在运行过程中丢失。

第一:要进行删除的结点为叶结点,直接把其从二叉排序树中进行删除。

第二:此结点只有左子树或者右子树,这种情况下只需将只需把此结点的左子树或者右子树替换为双亲结点的左子树。

第三:此结点有左子树同时有也右子树,此种操作比较复杂,其中有两种方法进行删除,本课程设计中应用的方法是从某子树中找出一个结点(假设为 Temp ),将其值代替要进行删除结点的值,再把 Temp 结点进行删除。

这是 本人在大二的时候做的一个课程设计,见到论坛上有很多对二 叉树,特别是二叉排序树的不了解,所以,把它分享出来,如果需要每个功能模块的说明,设计文档,请给我发邮件或者到我的下载页面去下载,由于本人不在乎资 源分,所以下载页面所需资源分只1分就可以下载整个设计,包括详细的设计报告,不过本人把它转为PDF文档。同时,发表显示与编辑显示不太一样,本人对这玩意儿很少用,还是请看原版吧,有需要原版请与我联系。

 

我的 邮箱:sw_2006.1230@163.com     443120079@qq.com

 

下面为详细代码,希读者能看懂,由于本人一直专注于嵌入式底层驱动程序开发,所以,对数据结构与算法只能做为加强自己C语言的一个途径,也许在算法上与数据结构的组织上不太合理,请原谅。


 

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页