- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
AVL树研究与实现.doc
AVL树研究与实现
摘要:计算机最广为人知的优点之一是其能储存大量的数据,如今随着时代的发展,储存容量更是犹如日进千里一般极速扩展,大容量的硬盘、U盘早已随处可见。然而,要在巨大的数据中搜索出需要的内容却不是一件容易的事,由此,为了能减少在搜索储存数据上的开销,各种适应于不同访问搜索背景的数据结构应运而生。树,便是计算机学科中最基本的数据结构之一,提供了快速的储存和访问性能。该文探究了带有平衡条件的二叉查找树――AVL树的原理,并对其使用C语言进行了实现。
关键词:数据结构;平衡二叉查找树;AVL树
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)07-1532-04
对于大量的输入数据,普通的线性数据结构访问时间太慢,例如,对于一个有N个数据的线性数据结构,假设对每个数据的访问几率大致相同,每个数据每次访问有1/N的机会被访问,由于是线性数据,因此每个数据的访问花销可以经过一定的排列,最通常的是访问第一个数据花销1个单位时间,第二个2个单位时间,第三个3各单位时间……第N个N各单位时间,于是访问一次的平均花销为(N+[N2])/2N = (1+N)/ 2,用计算机专业的符号来说,其访问运行时间可以用O(N)来表示,即访问一次线性数据结构的花销在N这个数量级上。使用树这一数据结构可将访问花销将至logN这个数量级上,也即O(logN),这里logN是以二为底的N的对数。可以对比一下,若N=1267650600228229401496703205376,则logN=100。数字越大,则O(N)与O(logN)相差越大。
一般来说,计算机学科中使用的最基本的树为二叉查找树,下图是一颗二叉树的简单示意图:
图1 二叉树示意图
二叉查找树则是在二叉树的基础上得来。假设在一颗二叉树中,每个节点都有一个关键词值,并且关键词值都是互异且可以比较,若对于此二叉树中的每个节点,其左子树中所有节点的关键词值小于其本身关键词值,其右子树中所有关键词值大于其本身关键词值,则此二叉树为二叉查找树。
AVL树,则是最先发明的带有平衡条件的二叉查找树。
下面,就让我们来分析一下AVL树的思想和原理。
1 AVL树思想和原理
正如上所述,AVL树是一种带有平衡条件的二叉查找树。那么,这个平衡条件是什么呢?
对于二叉查找树这样的数据结构来说,由于其节点有着按顺序排列的性质,若有数据往此数据结构中插入,则可能会引起树的高度过高,使得访问数据的花销可能会比应有的要多。
例如,对于只有一个节点X的二叉查找树,若此后往树中插入的元素其关键词值皆小于X的关键词值,那么这棵树的左子树就会越来越庞大,最终访问一个比X小得多的数据可能会花费相当多的开销,而如果在插入数据到一定程度时选择X的左子树中适当的节点作为根节点,则情况会好得多。
如上所述的即是平衡条件,即使得树的深度不致过于深,让左子树和右子树的高度相差不宜过大。同时,从应用的角度来说,这个平衡条件必须容易实现,并且应该允许能够易如反掌地对数据结构进行如插入数据、删除数据这样的常见操作。
1.1 AVL树的思想与原理
对于一颗AVL树来说,其平衡条件是要求其每个节点的左子树和右子树的高度最多差一。例如,在图2中,左边的树为AVL树,右边的则不是:
据资料显示,一个AVL树的高度平均来说只有1.44log(N+2) ? 1.328,并且其实际上的高度只比logN多一点,这样的访问花销是比较高效的。
那么,AVL树是如何实现这个平衡条件的呢?很幸运,这个解决方法并不难。事实上,我们是可以通过足够简单的对树的修改来做到。
1.2 AVL树的旋转操作
在对一颗AVL树进行插入数据或者删除数据的操作时,我们通过一种称之为“旋转”的操作来保持树的左右子树之差。由于对像二叉查找树这样本身已经包含排列性质的数据结构的修改,一般来说只有插入数据和删除数据是常用的,所以在这作者只使用插入数据来分析AVL树的旋转操作,删除数据可以依理推知。
同时,由于插入节点后,只有那些从插入点到根节点路径上的节点的平衡性会改变,所以在对树进行操作以更新平衡时,能找到这样一个节点,它破坏了平衡性,但是可以对它进行操作使得树重新变得平衡。
现在假设这个破换平衡的节点为W。可知,根据AVL树的定义可知,此时W的左子树和右子树的高度差为二,并且这种造成不平衡的插入操作会有如下四种情况:
1)对W的左儿子的左子树进行一次插入;
2)对W的右儿子的右子树进行一次插入;
3)对W的左儿子的右子树进行一次插入;
4)对W的右儿子的左子树进行一次插入。
可以看出,1
文档评论(0)