前面我们提到了二叉查找树,支持快速的查找、插入和删除操作。中序遍历二叉查找树,可以输出有序的数据序列,非常高效。
但是,二叉查找树存在一个问题,一般情况下二叉查找树的搜索、插入、删除的复杂度等于树高,时间复杂度为 ,不过在频繁的插入、删除过程中,可能会出现树的高度远大于 的情况,导致各种操作效率急剧下降,最坏的情况下,二叉树会退化为链表,时间复杂度为 。
由于这个原因,所以出现了很多改进版的平衡二叉树查找树,比如 AVL 树,红黑树等。
工程中,红黑树用的最多,这也是我们为什么以红黑树为代表来介绍。
平衡二叉查找树
平衡二叉查找树是改进版的二叉查找树。一般的二叉查找树的查询复杂度取决于目标节点到树根节点的距离,即深度。因此当目标节点的深度普遍较大的时候,查询的平均复杂度会上升。为了实现更高效率的查询,诞生了平衡二叉查找树。
那么平衡二叉查找树是怎样提高查询效率的呢,平衡二叉查找树规定,树中任意节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是 。例如上面提到的 AVL 树,它就是严格符合上面的这个定义。
但也有一些平衡二叉树并没有严格符合上面的定义(树中任意节点对应的两棵子树的最大高度差为1),比如我们今天要介绍的红黑树,它从根节点到各个叶子节点的最长路径,有可能会比最短路径大一倍。
平衡二叉查找树这种二叉树之所以出现,是为了解决普通二叉查找树在频繁的插入,删除操作时,时间复杂度退化的问题。所以最终能够解决这个问题就好,并不一定要严格符合平衡二叉查找树的定义。所谓“平衡”,简单来说就是让整棵树左右子树比较“平衡”,不要出现相差很大的情况。这样树的高度就能相对小一些,对应的各个操作的效率就会高一些。
红黑树
顾名思义,之所以叫红黑树,是因为它的每个节点都带有一个颜色属性,颜色为红色或黑色。另外还有如下额外的要求:
- 根节点是黑色
- 节点是红色或黑色
- 所有叶子节点都是黑色,叶子节点为 NIL 节点,不储存数据
- 每个红色节点必须有两个黑色的子节点。(从每个叶子到根