红黑树
红黑树是一种自平衡的二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。以下是红黑树的一些关键特性和操作的图文详解:
红黑树的特性:
- 节点颜色:节点是黑色或红色
- 根节点:根节点是黑色的。
- 叶子节点:所有叶子节点(NIL节点,空节点)都是黑色的。
- 红色节点的子节点:每个红色节点的两个子节点都是黑色的(不能有两个连续的红色节点)。
- 路径黑色节点数:从根节点到任意叶子节点(NIL节点)的路径上,黑色节点的数量相同。
可推导性质:
-
最长路径节点个数不会超过最短路径的两倍
-
最短路径:全部是黑色结点
-
最长路径:红黑相间(一黑一红,最后一个非NIL结点可以是红)
-
新增结点默认为红色,红色规则比黑色宽松
-
红黑树能够保证最坏情况下的操作时间复杂度为 O(log n)。
红黑树的操作:
- 插入操作:在插入新节点时,新节点通常被着色为红色,然后通过一系列旋转和重新着色操作来维持树的平衡。
- 删除操作:删除节点后,可能需要进行一系列的调整,包括重新着色和旋转,以保持树的平衡。
- 旋转操作:包括左旋和右旋,用于在插入和删除操作中调整树的结构。
- 查找操作:与普通二叉查找树类似,按照二叉查找树的规则进行查找。
自平衡操作
红黑树总是通过旋转和变色达到自平衡。
-
左旋:将某个节点A旋转为其右孩子B的左孩子。B节点的原左孩子E,变为A的子节点。
-
右旋:将某个节点A旋转为其左孩子B的右孩子。B节点的原右孩子E,变为A的子节点。
-
变色:红变黑、黑变红
红黑树的应用:
- 数据库索引:在数据库系统中,红黑树用于实现B树索引,提供高效的数据检索。
- 哈希表:在Java的
HashMap
和C++的std::map
中,当哈希冲突导致链表过长时,链表会被转换为红黑树。
总结:
红黑树是一种高效的自平衡二叉查找树,通过一系列规则和操作来保持树的平衡,确保了树的操作都能在对数时间内完成。
深入理解请阅读参考文章