二者都是二叉排序树的一种(关于二叉排序树的特征这里不再赘述)。
- 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靠平衡因子和旋转,红黑树靠节点颜色以及一些约定再加上旋转