红黑树随笔

199 阅读3分钟

1. 红黑树是什么?

红黑树本质是一种自平衡二叉查找树,但是他在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则(以下5种)

这些特征使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。

2.红黑树的5大规则

  • 节点可以是黑色或者红色
  • 根节点一定是黑色
  • 每个 叶子节点都是黑色的空节点(NIL节点)
  • 每个红色节点的左右子节点都必须是黑色
  • 从任一节点到其每个叶子节点的路径,都会经历相同的黑色节点

红黑树.png

3. 变色和旋转

由于以上的5种规则限制,红黑树的在增、删节点时,需要进行变色和旋转,来适配规则。

3.1 变色

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

上述动图,就是发生了2次红黑树的变色;流程为:

  • 原有的红黑树中插入了一个新的数据40;
  • 40和原来的红色节点30 发生了冲突:违背了规则四(每个红色节点的左右子节点都必须是黑色),所以进行一次变色
  • 变色后,又违背了规则二(根节点一定是黑色),所以进行了二次变色。
  • 经历两次变色后,红黑树变成了符合红黑树的5大规则
3.2 旋转

调整红黑节点结构,转移黑色节点位置,使其在进行插入、删除后仍能保持红黑树的 5 条性质。

旋转.gif

上述的动图发生了两次旋转;流程为:

  • 对有红黑树插入一个新的 17 节点;
  • 17 节点按照流程,插入了18节点的左边子节点;
  • 但是由于18是红色节点,为了规则四(红色节点的子节点都必须是黑色),所以执行了一次右旋转
  • 右旋转后:原本作为父节点的 18 ,变成 17 的右节点;但是旋转完成以后,还是不符合规则四;所以继续进行一次左旋转
  • 左旋转后:原本作为父节点的10,变成了17的左节点;
  • 此时已经符合红黑树的5项规则。
左旋转

逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为左孩子。

左旋转.png

如图所示:

一次左旋转后,原本的父节点X变成节点Y的左孩子节点

由于Y的左孩子节点需要变成新的X,所以原本Y的左孩子 节点B 需要被断开;

X变成Y的左孩子节点后,X的右孩子节点就空出来了;

所以:原本的被断开的B节点,就插入到了X的右孩子节点

右旋转

顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为右孩子。

右旋转.png

理解了左旋转,再看右旋转,就一个道理了。

如图所示:

一次右旋转后,原本的父节点X变成节点Y的右孩子节点

由于Y的左孩子节点需要变成新的X,所以原本Y的右孩子 节点C需要被断开;

X变成Y的右孩子节点后,X的左孩子节点就空出来了;

所以:原本的被断开的C节点,就插入到了X的左孩子节点