数据结构—二叉平衡树 红黑树

平衡二叉树(AVL)

   平衡二叉查找树,又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1。 也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。

那么如何是二叉查找树在添加数据的同时保持平衡呢?基本思想就是:当在二叉排序树中插入一个节点时,首先检查是否因插入而破坏了平衡,若 破坏,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子树中节点之间的关系,以达 到新的平衡。所谓最小不平衡子树 指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。  

局限性

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

应用

Windows NT内核中广泛存在.

AVL树的旋转规律

参考https://blog.csdn.net/liyong199012/article/details/29219261

AVL基本操作

插入:

1.使用递归算法,根据值大小查找到插入位置,

2.然后进行插入操作,

3.插入完成后,我们需要进行平衡判断,评估子树是否需要进行平衡修复,

4.需要则利用上述的四种情景套入代码即可,最后要记得重新计算插入结点路径上的高度。

删除:

平衡二叉树性能分析

平衡二叉树的性能优势:

      很显然,平衡二叉树的优势在于不会出现普通二叉查找树的最差情况。其查找的时间复杂度为O(logN)。

平衡二叉树的缺陷:

(1) 很遗憾的是,为了保证高度平衡,动态插入和删除的代价也随之增加。红黑树可以解决这个问题。

(2) 所有二叉查找树结构的查找代价都与树高是紧密相关的,能否通过减少树高来进一步降低查找代价呢。我们可以通过多路查找树的结构来做到这一点

(3) 在大数据量查找环境下(比如说系统磁盘里的文件目录,数据库中的记录查询 等),所有的二叉查找树结构(BST、AVL、RBT)都不合适。如此大规模的数据量(几G数据),全部组织成平衡二叉树放在内存中是不可能做到的。那么把这棵树放在磁盘中吧。问题就来了:假如构造的平衡二叉树深度有1W层。那么从根节点出发到叶子节点很可能就需要1W次的硬盘IO读写。大家都知道,硬盘的机械部件读写数据的速度远远赶不上纯电子媒体的内存。 查找效率在IO读写过程中将会付出巨大的代价。在大规模数据查询这样一个实际应用背景下,平衡二叉树的效率就很成问题了。

相关问题1:N层平衡二叉树至少多少个结点???????

设F(N)表示N层平衡二叉树的结点个数,则F[1]=1,F[2]=2。而F(N)=F(N-2)+F(N-1)+1

为什么呢?我们可以这样考虑,假设现在又一个(N-2)层和(N-1)层的最少结点平衡二叉树。要构造一棵N层的平衡二叉树,则只需加入一个根节点,其左右子树分别(N-2)层和(N-1)层的树即可 。由于两个子树都是最少结点的,所有N层的也是最少结点的。

最多结点数,为了得到最大结点数,则左右子树的高必须相等,即都填充到h-1,由于结点都充满了,那么该树不仅是AVL树而且还是一个完全二叉树了,则会有如下公式:

N(h) = N(h-1) + N(h-1) + 1 = 2N(h-1) + 1

最终求解该递归公式得:

N(h)=O(2h)=>h=logn≈O(logn)N(h)=O(2h)=>h=logn≈O(logn)

  因此在两种情况下,AVL树的性质可以确保带有n个结点的AVL树的高度为O(logn)。这也意味着AVL树的操作在时间复杂度上近乎于O(logn),也就不可能出现BST(二叉查找树)的最糟糕情况O(n)。 

参考:https://blog.csdn.net/javazejian/article/details/53892797

猜你喜欢

转载自blog.csdn.net/hezuo1181/article/details/82289199