前面几篇分享中我们陆续介绍了平衡二叉树的定义、实现原理、构建过程演示以及对应的实现代码,我们提到平衡二叉树是最理想的二叉排序树,性能最好,也最稳定,但是缺点是维护成本高,需要在插入和删除节点时维护新树的平衡性,所以工程实践中,我们倾向于使用另一种二叉排序树 —— 红黑树,什么是红黑树?红黑树的性能如何?如何实现红黑树?带着这些问题,我们开始今天的分享,我们将会分两篇的篇幅来介绍红黑树的定义及其实现。
什么是红黑树
红黑树(Red-Black Tree)是每个节点都带有颜色属性的二叉排序(查找)树,具备以下特性:
下面是一个典型的红黑树示例:
这些约束保证了红黑树的关键特性:从根节点到叶子节点的最长的可能路径不多于最短的可能路径长度的两倍(每条路径红黑相间,且黑色节点数目相同,所以最短的路径上是两个黑色节点,相应的,此时最长路径节点一定是黑-红-黑-红,正好是其两倍),从而保证红黑树无论怎么插入、删除节点大致上也是平衡的。
红黑树的算法复杂度
我们上面提到由于红黑树的特性,可以确保即使在最差情况下,红黑树也是大致平衡的,下面我们来简单推导下红黑树的时间复杂度。
前面我们讲二叉排序树的时候说到二叉排序树的时间复杂度和树的高度成正比,红黑树是红黑相间的,我们可以先把红色的节点去掉,剩下的黑色节点就可能变成四叉树了,比如我们上面示例的那个红黑树。由于红黑树每条路径上黑色节点相同,所以可以继续把这个四叉树转化为完全二叉树,假设黑色节点的数量为 m,这样,这棵树的时间复杂度就是 O(logm) 了;然后我们把红色节点塞回来,红色节点的总数目肯定是小于等于黑色节点的,我们不妨假设等于黑色节点,这样,树的高度就增加一倍,对应的时间复杂度就是 2O(logm) 了,m≈n/2,由于在计算时间复杂度的时候,常量可以舍弃,所以红黑树的时间复杂度也是 O(logn)。虽然这里面都是估算的,但是由于前面提到的红黑树的特性约束,数量级上是没问题的。
为什么工程上大多使用红黑树
红黑树维护成本比平衡二叉树低,性能上也能大致做到 O(logn),且比较稳定,可以应付最差的情况。下一篇我们就来简单介绍下红黑树的实现。