红黑树特性及其变色和旋转

红黑树作为一种优秀的数据结构,因其高效的查找性能而广受好评~

在JDK的集合类中TreeMap和TreeSet就是红黑树实现的
而在Java8之后,连HashMap也用到了红黑树。

红黑树的特性

红黑树是二叉查找树(BST)衍生出来的一种,具备二叉查找树的基本特性。

  1. 左子树上所有结点的值均小于或等于它的根结点的值。
  2. 右子树上所有结点的值均大于或等于它的根结点的值。
  3. 左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:红黑树特性及其变色和旋转_第1张图片

红黑树是一种自平衡的二叉查找树,除了符合二叉查找树基本特性之外,还有以下特性:

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

正是因为这些特性限制,保证了红黑树的自平衡。红黑树从根节点到叶子的最长路径不会超过最短路径的两倍。

下图中这棵树,就是一颗典型的红黑树:

红黑树特性及其变色和旋转_第2张图片

红黑树的变色和旋转

在给红黑树插入或者删除节点的时候,红黑树的规则有可能被打破(ps:红黑树触发旋转算法的概率要远远小于AVL树),这个时候就需要进行变色和旋转操作来保持红黑树的特性。

首先来说 变色

为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

下图所表示的是红黑树的一部分,需要注意节点25并非根节点。因为节点21和节点22连续出现了红色,不符合规则4,所以把节点22从红色变成黑色:
红黑树特性及其变色和旋转_第3张图片
这只是变色的示范,根据实际情况可能会需要多次变色操作

旋转

而通常仅仅靠变色是无法解决问题的,这个时候就需要用到旋转。

左旋转
红黑树特性及其变色和旋转_第4张图片
旋转后,一边的子节点会替代父节点成为新的父节点,次子节点会移动到原来的父节点上面。

旋转前后对比:

红黑树特性及其变色和旋转_第5张图片
右旋转
红黑树特性及其变色和旋转_第6张图片
与左旋转类似,只是旋转的方向不同。
旋转前后对比:
红黑树特性及其变色和旋转_第7张图片
说明:

  1. 关于红黑树自平衡的调整的原理,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。

你可能感兴趣的:(红黑树特性及其变色和旋转)