1. 红黑树简介
红黑树是一种特殊的二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。
红黑树在很多地方都有应用,例如:
1. Java中的TreeMap和TreeSet
2. 数据库中的索引实现
2. 红黑树的特性
红黑树有以下五个重要的性质:
1. 每个节点要么是红色,要么是黑色。
2. 根节点必须是黑色。
3. 每个叶节点(NIL节点,空节点)是黑色的。
4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
5. 对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
这些性质确保了红黑树的关键特性:从根到叶子的最长可能路径不多于最短可能路径的两倍长。
3.红黑树的插入
- 按照二叉搜索树的规则插入新节点,并将新节点着色为红色。
- 插入的节点默认是红色的,从插入的新节点开始,向上回溯,检查是否违反红黑树的性质,如果违反则进行调整。
- 调整过程主要分为以下几种情况:
1.如果插入的是根节点,直接将其染成黑色。
2. 如果父节点是黑色,不需要调整。
3. 如果父节点是红色,叔叔节点也是红色,就将叔叔父亲爷爷节点变色,爷爷变成插入节点继续向上判定是否违反了红黑树的性质
4.如果父节点是红色,叔叔节点是黑色或不存在:
以下分为(LL,RR,LR,RL)
将爷爷节点右旋,然后和父亲节点一起变色。
将爷爷节点左旋,然后和父亲节点一起变色
先做旋爷爷的左孩子节点(父亲节点)再右旋。得到:
再将旋转中心点和爷爷节点变色
先右旋右孩子再左旋爷爷节点,得到:
再将旋转中心点和爷爷节点变色
4.红黑树的删除
- 按照二叉搜索树的方法找到并删除目标节点。
- 如果被删除的节点有两个子节点,用其后继节点(右子树中最小的节点)替代它。
- 调整树的结构和颜色,以维持红黑树的性质。这是最复杂的部分,需要考虑多种情况:a. 如果被删除的节点是红色,直接删除不会影响红黑树的性质。b. 如果被删除的节点是黑色,需要进行以下调整:
- 情况1: 被删除节点的替代节点是红色
将替代节点染成黑色即可。 - 情况2: 被删除节点的替代节点是黑色
这种情况最复杂,需要进一步分类讨论:i. 如果当前节点是新的根节点,直接返回。ii. 如果当前节点的兄弟节点是红色:- 将兄弟节点染黑,父节点染红
- 对父节点进行左旋或右旋
- 继续处理
- 将兄弟节点染红
- 将父节点作为新的当前节点,继续向上处理
- 将兄弟节点的左子染黑,兄弟节点染红
- 对兄弟节点右旋
- 继续处理
- 将兄弟节点染成父节点的颜色
- 将父节点染黑
- 将兄弟节点的右子染黑
- 对父节点左旋
- 调整结束
- 情况1: 被删除节点的替代节点是红色
- 最后,将根节点染黑。