java数据结构及算法之平衡二叉树(AVL树)的设计及实现

java数据结构及算法之平衡二叉树(AVL树)的设计及实现

ID:37858393

大小:648.00 KB

页数:13页

时间:2019-06-01

java数据结构及算法之平衡二叉树(AVL树)的设计及实现_第1页
java数据结构及算法之平衡二叉树(AVL树)的设计及实现_第2页
java数据结构及算法之平衡二叉树(AVL树)的设计及实现_第3页
java数据结构及算法之平衡二叉树(AVL树)的设计及实现_第4页
java数据结构及算法之平衡二叉树(AVL树)的设计及实现_第5页
资源描述:

《java数据结构及算法之平衡二叉树(AVL树)的设计及实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、java数据结构与算法之平衡二叉树(AVL树)的设计与实现普通二叉查找树的问题  在开篇,我们提到过,普通二叉树(二叉查找树)在操作的时间复杂度上不一定遵循O(㏒n),也有可能是O(n),这是为什么呢?在上一篇中,我们明明插入都按照一定规则比较的呀,其实那是因为我们在上篇测试时执行了随机插入的操作,如果此时利用上篇实现的二叉搜索树将一段已排序好的数据一个个插入后,就会发现如下情况了: 从图中我们可以发现,把已排序的1-9数据进行正序与倒序插入后,树的结构已变成单向左子树或者右子树了,如果我们在往

2、里插入已排序的数据,那么单向左子树或者右子树越来越长,此时已跟单链表没有什么区别了,因此对此结构的操作时间复杂度自然就由O(㏒n)变成O(n)了,这也就是普通二叉查找树不是严格意义上O(㏒n)的原因。那么该如何解决这个问题呢?事实上一种解决的办法就是要有一个称为平衡的附加结构条件即:任何结点的深度不得过深,而这种数据结构就是我们本篇要分析的平衡二叉树(AVL),它本身也是一种二叉查找树,只不过不会出现前面我们分析的情形罢了,接下来我们就来分析一下这棵平衡二叉树。平衡二叉树的定义  通过上面的分析

3、,我们明白的普通二叉查找树的不足,也知道了如何去解决这个缺点,即构建树时要求任何结点的深度不得过深(子树高度相差不超过1),而最终这棵树就是平衡二叉树(BalancedBinaryTree),它是G.M.Adelson-Velsky与E.M.Landis在1962年在论文中发表的,因此又叫AVL树。这里我们还需要明确一个概念,AVL树只是实现平衡二叉树的一种方法,它还有很多的其他实现方法如红黑树、替罪羊树、Treap、伸展树等,后面我们还会分析其他树的实现。ok~,接着来了解一下AVL树的特性:

4、一棵AVL树是其每个结点的左子树与右子树的高度最多相差1的二叉查找树(空树的高度为-1),这个差值也称为平衡因子(其取值可以是1,0,-1,平衡因子是某个结点左右子树层数的差值,有的书上定义是左边减去右边,有的书上定义是右边减去左边,这样可能会有正负的区别,但是这个并不影响我们对平衡二叉树的讨论)。如下图图(1)显然就是一棵平衡二叉树,它每个结点的左子树与右子树的高度最多相差1,同时也是一棵二叉查找树,而图二虽然也是一棵二叉查找树,但是它每个结点的左子树与右子树的高度相差却到达了2,因此不是平衡

5、二叉树。理解了平衡二叉树的概念后,我们在思考一下,那些操作可能引起平衡发生变化呢?显然只有那些引起结点数量变化的操作才可能导致平衡被改变,也就是删除与插入操作了,如下图,我们把6插入到图a后,结构变成了图b,这时原本的平衡二叉树就失去平衡了。显然图b已失去平衡,如果发生这样的情况,我们就必须考虑插入元素后恢复二叉树的平衡性质,实际上也总是可以通过对树进行简单的修复来让其重新恢复到平衡,而这样的简单操作我们就称之为旋转,当然旋转也有单旋转与双旋转之分,下面我们将会一一分析,这里有点需要明白的是,无

6、论是插入还是删除,只有那些从插入或者删除点到根结点的路径上的结点的平衡才有可能被改变,因为只有这些结点的子树才可能发生变化,所以最终也只需针对这些点进行平衡修复操作即可。平衡二叉树的设计与实现  ok~,有了旋转的概念后,我们接着了解如何通过旋转来修复一棵失衡的二叉树,这里假设结点X是失衡点,它必须重新恢复平衡,由于任意结点的孩子结点最多有两个,而且导致失衡的必要条件是X结点的两棵子树高度差为2(大于1),因此一般只有以下4种情况可能导致X点失去平衡:①在结点X的左孩子结点的左子树中插入元素②在

7、结点X的左孩子结点的右子树中插入元素③在结点X的右孩子结点的左子树中插入元素④在结点X的右孩子结点的右子树中插入元素以上4种情况,其中第①情况与第④情况是对称的,可以通过单旋转来解决,而第②种情况与第③情况是对称的,需要双旋转来解决。在分析这四种情况前,我们先看看AVL的结点该如何设计的,其声明如下:packagecom.zejian.structures.Tree.AVLTree;/***Createdbyzejianon2016/12/25.*Blog:http://blog.csdn.ne

8、t/javazejian[原文地址,请尊重原创]*平衡二叉搜索树(AVL树)节点*/publicclassAVLNode{publicAVLNodeleft;//左结点publicAVLNoderight;//右结点publicTdata;publicintheight;//当前结点的高度publicAVLNode(Tdata){this(null,null,data);}publicAVLNode(AVLNodeleft,AVLNode

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。