树与二叉树3之平衡二叉树

上一篇我们介绍了二叉查找树,尽管其实现简单,但也有其明显的局限性

一、从二叉查找树到平衡二叉树

一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链.如下图: 

《树与二叉树3之平衡二叉树》

b图为一个普通的二叉查找树,a图中,如果我们的根节点选择不恰当如最小或者最大的数,那么二叉查找树就完全退化成了线性结构链表,因此,在二叉查找树的基础上,又出现了AVL树,红黑树,它们都是基于二叉查找树,只是在二叉查找树基础上对其做了限制。

二、平衡二叉树(Balanced Binary Tree)AVL树

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

AVL树是带有平衡条件的二叉查找树,是一种二叉查找树。是为了解决二叉查找树的不平衡性导致查找操作的时间复杂度过高。是基于二分法的策略提高数据的查找速度的二叉树的数据结构。

它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。AVL树很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

平衡因子(BF):结点的左子树的深度减去右子树的深度,那么即 |BF|<=1显然-1<=bf<=1,

那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。 

 《树与二叉树3之平衡二叉树》
 
对于3这个结点来讲,左子树高度为2,右子树高度为0,左右子树高度差为2,2>1,所以该树不是平衡二叉树。

 《树与二叉树3之平衡二叉树》
 
对于这个树里面的每一个结点来讲,左右子树的高度差都小于等于1,所以该树是平衡二叉树 。

高度为h的平衡二叉树的最小结点数:N(h) = N(h-1)+N(h-2)+1 。其中N(h-1) 和N(h-2)分别是高度为(h-1)和高度为(h-2)的最小结点数。可以推导出——给定结点数为 n的AVL树的最大高度为O(log2n)!
 

《树与二叉树3之平衡二叉树》

 

三、平衡二叉树不平衡的四种情形:

《树与二叉树3之平衡二叉树》

把需要重新平衡的结点叫做α,由于任意两个结点最多只有两个儿子,因此高度不平衡时,α结点的两颗子树的高度相差2.容易看出,这种不平衡可能出现在上图中四种情况中:

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

 

四、平衡二叉树的操作

4.1、平衡二叉树的插入

插入的方法和二叉查找树基本一样,区别在于插入完成后需要从插入的节点开始维护一个到根节点的路径,没经过一个节点都要维持树的平衡,维持树的平衡要根据高度差的特点选择不同的旋转方法。

插入的时间复杂度为o(logN)

《树与二叉树3之平衡二叉树》

4.2、平衡二叉树的查找

平衡二叉树使用和二叉查找树完全相同的查找方法,不过根据高度基本平衡存储的特性,平衡二叉树能保持O(logN)的稳定时间复杂度,而二叉查找树极端情况会退化成链表

 

4.3、平衡二叉树的删除

平衡二叉树的删除和二叉查找树一致,区别是删除完成后,需要从删除节点的父亲开始向上维护树的平衡一直到根节点

删除分为以下几种情况:

首先在整个二叉树中搜索要删除的结点,如果没搜索到直接返回不作处理,否则执行以下操作:

1.要删除的节点是当前根节点T。

如果左右子树都非空。在高度较大的子树中实施删除操作。分两种情况:

(1)、左子树高度大于右子树高度,将左子树中最大的那个元素赋给当前根节点,然后删除左子树中元素值最大的那个节点。

(1)、左子树高度小于右子树高度,将右子树中最小的那个元素赋给当前根节点,然后删除右子树中元素值最小的那个节点。

如果左右子树中有一个为空,那么直接用那个非空子树或者是NULL替换当前根节点即可。

2、要删除的节点元素值小于当前根节点T值,在左子树中进行删除。

递归调用,在左子树中实施删除。

这个是需要判断当前根节点是否仍然满足平衡条件,如果满足平衡条件,只需要更新当前根节点T的高度信息。否则,需要进行旋转调整:

如果T的左子节点的左子树的高度大于T的左子节点的右子树的高度,进行相应的单旋转。否则进行双旋转。

3、要删除的节点元素值大于当前根节点T值,在右子树中进行删除。

《树与二叉树3之平衡二叉树》

《树与二叉树3之平衡二叉树》

 

5、平衡二叉树的应用场景

二叉树支持动态的插入和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的工作,动态性。但是二叉树有可能出现worst-case,如果输入序列已经排序,则退化到链表,时间复杂度为O(N)

平衡二叉树/红黑树主要优点集中在快速查找,就是为了将查找的时间复杂度保证在O(logN)范围内而出现的,所以如果输入结合确定,所需要的就是查询,则可以考虑使用哈希表,如果输入集合不确定,则考虑使用平衡二叉树/红黑树,保证达到最大效率。

为了维护平衡二叉树,不管是执行插入还是删除操作,只要不满足平衡条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此AVL树适合用于插入删除次数比较少,但查找多的情况。 

实际中平衡二叉树在Windows NT内核中广泛存在、SGI/STL的set/map底层都是用红黑树(平衡二叉树的一种)实现的

局限性
由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树.当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树.

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/u014028063/article/details/83095940
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞