红黑树

红黑树是一种自平衡的二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。以下是红黑树的一些关键特性和操作的图文详解:

红黑树的特性:

  1. 节点颜色:节点是黑色或红色
  2. 根节点:根节点是黑色的。
  3. 叶子节点:所有叶子节点(NIL节点,空节点)都是黑色的。
  4. 红色节点的子节点:每个红色节点的两个子节点都是黑色的(不能有两个连续的红色节点)。
  5. 路径黑色节点数:从根节点到任意叶子节点(NIL节点)的路径上,黑色节点的数量相同。

可推导性质:

  • 最长路径节点个数不会超过最短路径的两倍

  • 最短路径:全部是黑色结点

  • 最长路径:红黑相间(一黑一红,最后一个非NIL结点可以是红)

  • 新增结点默认为红色,红色规则比黑色宽松

  • 红黑树能够保证最坏情况下的操作时间复杂度为 O(log n)。

红黑树的操作:

  • 插入操作:在插入新节点时,新节点通常被着色为红色,然后通过一系列旋转和重新着色操作来维持树的平衡。
  • 删除操作:删除节点后,可能需要进行一系列的调整,包括重新着色和旋转,以保持树的平衡。
  • 旋转操作:包括左旋和右旋,用于在插入和删除操作中调整树的结构。
  • 查找操作:与普通二叉查找树类似,按照二叉查找树的规则进行查找。

自平衡操作

红黑树总是通过旋转和变色达到自平衡。

  • 左旋:将某个节点A旋转为其右孩子B的左孩子。B节点的原左孩子E,变为A的子节点。

  • 右旋:将某个节点A旋转为其左孩子B的右孩子。B节点的原右孩子E,变为A的子节点。

  • 变色:红变黑、黑变红

红黑树的应用:

  • 数据库索引:在数据库系统中,红黑树用于实现B树索引,提供高效的数据检索。
  • 哈希表:在Java的HashMap和C++的std::map中,当哈希冲突导致链表过长时,链表会被转换为红黑树。

总结:

红黑树是一种高效的自平衡二叉查找树,通过一系列规则和操作来保持树的平衡,确保了树的操作都能在对数时间内完成。

深入理解请阅读参考文章

参考

posted @ 2024-09-06 13:55  抒写  阅读(8)  评论(0编辑  收藏  举报