问题引入
二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。要解决这个复杂度退化的问题,需要设计一种平衡二叉查找树。在工程中,很多用到平衡二叉查找树的地方都会用红黑树。为什么工程中都喜欢用红黑树,而不是其他平衡二叉查找树呢?
什么是“平衡二叉查找树”?
平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。
平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL 树,它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。
很多平衡二叉查找树其实并没有严格符合上面的定义(树中任意一个节点的左右子树的高度相差不能大于 1),比如红黑树它从根节点到各个叶子节点的最长路径,有可能会比最短路径大一倍。
学习数据结构和算法是为了应用到实际的开发中的,没必要去死抠定义。对于平衡二叉查找树这个概念要从这个数据结构的由来,去理解“平衡”的意思。发明平衡二叉查找树这类数据结构的初衷