AVL树(http://baike.baidu.com/view/593144.htm?fr=aladdin),又称(严格)高度平衡的二叉搜索树。其他的平衡树还有:红黑树、Treap、伸展树、SBT。
注:使用 "nil 叶子"或"空(null)叶子",它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,导致了这些树好象同上述原则相矛盾,而实际上不是这样。与此有关的结论是所有节点都有两个子节点,尽管其中的一个或两个可能是空叶子。
红黑树(http://baike.baidu.com/view/133754.htm?fr=aladdin),红黑树也是二叉查找树,统计性能要好于平衡二叉树。典型的用途是实现关联数组。因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set,multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。
很多介绍算法的教科书在红黑树之前介绍 2-3-4 树(http://baike.baidu.com/view/1995382.htm),尽管2-3-4 树在实践中不经常使用。
2-节点,就是说,它包含 1个元素和 2 个儿子;
3-节点,就是说,它包含 2个元素和 3 个儿子;
4-节点,就是说,它包含 3个元素和 4 个儿子。
注: (1)、2-3-4 树是可以用做字典的一种自平衡资料结构。
(2)、2-3-4 树是红黑树的一种等同,这意味着它们是等价的数据结构。换句话说,对于每个 2-3-4 树,都存在着至少一个数据元素是相同次序的红黑树。在 2-3-4 树上的插入和删除操作也等价于在红黑树中的颜色翻转和旋转。这使得它成为理解红黑树背后的逻辑的重要工具。
红黑树的关键性质: 从根到叶子的最长的可能路径不多于(<=)最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
注:最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。
红黑树与AVL树的比较:
AVL是严格的平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多;
红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低开销;
所以简单说,如果你的应用中,搜索的次数远远大于插入和删除,那么选择AVL树,
如果搜索,插入删除次数几乎差不多,应选择红黑树。即,有时仅为了排序(建立-遍历-删除),不查找或查找次数很少,R-B树合算一些。
红黑树与AVL树的调整平衡的实现机制不同,AVL靠平衡因子和旋转,红黑树靠节点颜色以及一些约定再加上旋转。因此,存在去掉颜色的红黑树后它不是AVL树,比如左子树都是黑的,右子树都是红黑相间的,这样整个树高度2n的时候,根节点的左右层数差可以到n。