AVL树,红黑树与平衡二叉树的区别

浅析平衡二叉树、AVL树、红黑树

平衡二叉树

​ 在了解红黑树之前,首先要了解一下什么是平衡二叉树。平衡树(Balance Tree,BT) 指的是,一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也都是一棵平衡二叉树。

平衡的四种类型:

LL型:在左子树的左孩子上插入元素;解决办法:(左旋) 如下图:

AVL树,红黑树与平衡二叉树的区别_第1张图片

RR型:在右子树的右孩子上插入元素;解决办法(右旋)如下图:

AVL树,红黑树与平衡二叉树的区别_第2张图片

RL型:在右子树的左孩子上插入元素;解决办法(先右旋再左旋) 如下图:

AVL树,红黑树与平衡二叉树的区别_第3张图片

LR型:在左子树的右孩子上插入元素;(先左旋再右旋)

AVL树,红黑树与平衡二叉树的区别_第4张图片

红黑树

​ 红黑树就是一种特殊的平衡二叉树,那么他就存在着平衡二叉树的特点,同时他也存在自己特有的特点。相对一般的平衡二叉树来说,他在基本的平衡二叉树中添加了着色(红色和黑色)和相关的一些性质,使得红黑树平衡。

红黑树具体具有的特征:
  • 性质1.结点存在颜色(只能是红和黑);
  • 性质2.根节点必须是黑色;
  • 性质3.每个叶子结点(指树尾端的NULL或者NIL结点)是黑色的;
  • 性质4.每个红色结点的子结点必须为黑色(不能两个红色结点相连,可以两个黑色相连);
  • 性质5.对任意结点而言,它到子树的叶节点尾端NIL指针的路径包含相同数目的黑结点。
红黑树添加元素的情况以及实现平衡

​ 插入过程首先是根据一般二叉查找树的插入步骤, 把新节点 z 插入到 某个叶节点的位置上,然后将 z 着 为红色。 为了保证红黑树的性质能继续保持,再对有关节点重点着色并旋转,(以左子树为例)其插入情况如下:

  • 第一种情况:当前为一颗空树,我们插入的结点为根节点,
    此时插入为根节点,但是和性质2 违背,所以这时候,我们的对策就是直接将这个结点改为黑色就可以了。
  • 第二种情况:插入的结点的父节点为黑色,这时候就可以直接插入结点。
  • 第三种情况:父节点为红色,且祖父结点的另外一个子节点(叔结点)也是红色。此时插入结点,会造成两个红色结点相连。与性质4相违背。
    这时候我们就将父节点和叔结点都改为黑色,并且将祖父结点改为红色(将两个同时设置为黑色,且祖父结点设置为红是为了保证性质5)。
  • 第四种情况:当前结点的父节点为红色,其叔结点为黑色,当前结点为父节点的右结点。此时我们将当前结点的父节点为新的当前结点,以型的当前结点左旋。
  • 第五种情况:当前结点的父节点为红色,其叔结点为黑色,当前结点为父节点的左结点。此时我们将当前结点的父节点变为黑色,祖父结点变为红色,祖父结点为支点右旋。

​ 一般来说,第四、第五种情况都是在第三种情况后的插入修复操作,所以我们可以将第三,四,五种情况当做一种完整的插入修复的操作流程。

应用范围:
  1. 广泛用于C ++的STL中,地图是用红黑树实现的;
  2. Linux的的进程调度,用红黑树管理进程控制块,进程的虚拟内存空间都存储在一颗红黑树上,每个虚拟内存空间都对应红黑树的一个节点,左指针指向相邻的虚拟内存空间,右指针指向相邻的高地址虚拟内存空间;
  3. IO多路复用的epoll采用红黑树组织管理sockfd,以支持快速的增删改查;
  4. Nginx中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器;
  5. Java的TreeMap的实现;
AVL树

​ AVL树是带有平衡条件得二叉查找树,也是最早被发明得自平衡二叉查找树,在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树,所以它必须满足平衡条件。

AVL树失衡与重平衡

AVL树的失衡的两种情况:

  1. 新节点插入导致:新节点的插入可能导致很多祖先节点的失衡,但是经过一次旋转就能把所有的失衡节点全都回复。插入导致的失衡有以下两种情况情况

    情况1:单旋解决

    AVL树,红黑树与平衡二叉树的区别_第5张图片

    情况2:双旋解决

    AVL树,红黑树与平衡二叉树的区别_第6张图片

  2. 节点删除导致:节点的删除只会导致一个祖先节点的失衡,但是在节点恢复的时候可能导致新的祖先节点的失衡,而且这种情况在每一层都出现,所以需要逐层向上检查并旋转恢复。删除导致的失衡也有如下两种情况:

    情况1:单旋解决

    AVL树,红黑树与平衡二叉树的区别_第7张图片

    情况2:双旋解决

    AVL树,红黑树与平衡二叉树的区别_第8张图片

AVL树的性能

优点:

  • 无论查找、插入或者删除,最坏情况下的复杂度均为O(logn),O(n)的存储空间。

缺点:

  • 借助高度或者平衡因子,所以需要改造元素结构,或者额外封装这一属性。
  • 插入或删除后的旋转成本高,删除操作后,最多要旋转logn次(一般5次操作发生一次这种情况),所以频繁插入删除成本高。
  • 单次动态调整后,全树拓扑结构的变化量可能高达longn,这在实际的应用中是很避讳的。
AVL树与红黑树的比较:
  1. 因为相同节点的情况下AVL树的高度会低于黑红树,因此在做查找时AVL树用的时间相对会少。
  2. 在删除和插入的时候,AVL树由于具有高度平衡,而红黑树只是弱平衡,因此黑红树旋转次数会远小于AVL树。
  3. 红黑树在失衡的情况下恢复平衡比AVL树快,因此红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强。
总结:

AVL树:平衡性高,失衡恢复时间长因此稳定性差,易查找不易删除插入。

红黑树:平衡性低,失衡恢复较快因此稳定性高,但树长相对较高,查找,删除,插入都比较方便。

参考:https://blog.csdn.net/u010899985/article/details/80981053

参考:https://blog.csdn.net/qq_18108083/article/details/84932582

你可能感兴趣的:(数据结构,二叉树,avl)