红黑树(RBT)和平衡二叉树(AVL)

二者都是二叉排序树的一种(关于二叉排序树的特征这里不再赘述)。

  • AVL是严格高度平衡的二叉排序树(平衡二叉树。由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树)
  • RBT是非严格平衡的二叉平衡树

下面来阐述一下AVL和RBT各自具有的特性:

AVL:

  • 可以是空树
  • 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树
  • 任何一个节点的左子树与右子树高度差的绝对值不大于1,可以为-1,0,1

RBT(5条):

  • 每个结点要么是红的,要么是黑的
  • 根结点是黑的
  • 每个叶结点,即空结点(NIL)是黑的[注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  • 如果一个结点是红的,那么它的俩个儿子都是黑的
  • 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点

下面简单说下二者在实现上的关键点:

AVL:

任何一个节点的左子树与右子树高度差的绝对值不大于1,可以为-1,0,1,那么这个差值我们称作为**平衡因子**,在插入和删除某个节点的时候根据平衡因子变大(大于1)或者(小于-1)的情况选择某种手段即左旋、右旋、双旋(先左旋后右旋或者先右旋后左旋)使**失衡**的二叉树重新回归平衡。

RBT:

红黑树是在插入和删除某个节点的时候并在保证上述5条性质的前提下,进行左旋或者右旋。使二叉树重归红黑树。
(这里简要阐述基本原理,不再做代码实现演示)

继续简述二者的区别和应用场景:

  • 一般情况下,AVL旋转的次数比红黑树要多
  • 红黑树是用非严格的平衡的“缺陷”来换取增删节点时候旋转次数,进而降低性能开销
  • 搜索的次数远远大于插入和删除次数,宜使用AVL
  • 搜索和插入删除次数不相上下,使用红黑树
  • 二者调整平衡的实现机制不同:AVL靠平衡因子和旋转,红黑树靠节点颜色以及一些约定再加上旋转

你可能感兴趣的:(数据结构与算法)