深入理解红黑树(red black tree)

红黑树特性

红黑树(red black tree),是一个平衡二叉查询树,对红黑树的操作在最坏的情形下,花费O(logN)的时间。红黑树与AVL平衡二叉查询树比,树的平均深度差不多,查询效率相当。但是,其插入或删除操作的开销比AVL平衡二叉查询树相低得多,而且在实践中红黑树发生旋转的次数相对较少。其特性如下:

  1. 每一个节点是红色或者黑色。
  2. 根节点是黑色。
  3. 如果一个节点是红色,那么它的子节点必须是黑色的。
  4. 从一个节点到一个null引用的每一条路径必须包含相同数目的黑色节点。

以如下红黑树为例,如图:

  1. 每一个节点是红色或者黑色。
  2. 根节点[17]是黑色。
  3. 节点[10]为红色,左子节点[9]和右子节点[12]都是黑色
  4. 到节点[12]的左子节点null节点的每一条路径,必须包含相同数目的黑色节点。则已经存在的节点[13]必须是红色;如果要在节点[12]的左儿子节点添加一个新的节点,则新添加的子节点必须是红色

红黑树节点旋转和颜色翻转

通常,红黑树在插入或者删除节点时,容易破坏其特性。一般会通过节点旋转和颜色翻转,即可在插入或删除操作完成后,恢复红黑树的特性。

  • 直接插入节点
图-1

在图-1中,往左边的红黑树添加节点[17],由于不破坏红黑树特性,所以直接添加即可。

  • 单旋转并转换颜色
图-2

在图-2中,往左边的红黑树添加节点[5]。由于节点[10]是红色,不满足红黑树特性3。此时,节点[17]和节点[70]的高度相差大于1,并且,添加节点[5]属于左儿子左子树的情况。需要对其进行单旋转(单旋转可参考AVL平衡二叉查询树-分分钟钟被安排地明明白白),并且把节点[10]颜色转换为黑色。

  • 双旋转并转换颜色
图-3

在图-3中,需要往红黑树中添加节点[12]。此时,其父节点[10]颜色为红色,不满足红黑树特性3。节点[17]和节点[70]的高度相差大于1,并且,添加节点[12]属于左儿子右子树的情况,需要进行双旋转(双旋转可以参考AVL平衡二叉查询树-分分钟钟被安排地明明白白)。结果为图-3右侧的树,节点[12]颜色为黑色,节点[17]颜色为红色。

  • 转换颜色
图-4

在图-4中,需要添加节点[13]。由于,存在节点[10]为黑色,节点[17]也是黑色,节点[9]和节点[12]都是红色的情况。只需要,节点[10]与节点[9]和节点[12]转换颜色即可。

发布了37 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/new_com/article/details/104449600