[数据结构]:红黑树

[数据结构]:红黑树

红黑树是二叉查找树的一种。二叉查找树的存在就是为了加快查找速度,时间复杂度为O(logn);为了防止二叉查找树在较坏的情况下退化为链表使时间复杂度变为O(n),引入了平衡二叉树(AVL树)和红黑树。

AVL平衡二叉树对二叉查找树的平衡要求较高,左右子树的高度差不能超过1,这会使得在插入/删除操作中频繁进行树的旋转,使得效率反而降低。红黑树对树的平衡度没有AVL树严格,但也大致保持了树的平衡,在实际中应用得更广泛,包括HashMap中冲突链表,TreeMap中的排序,优先级队列PriorityQueue中的排序等等,都广泛使用红黑树。

红黑树的性质&定义

  1. 每个结点不是红色就是黑色;
  2. 根节点是黑色;
  3. 叶结点都是黑色;(叶结点都为NIL)
  4. 如果一个结点是红色,那么它的两个子结点都是黑色(即不可能有两个相连的红色结点);
  5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点

如下图所示,即为一棵红黑树
[数据结构]:红黑树_第1张图片

满足上面的5个性质&定义

变换规则

旋转和颜色变换规则:所有插入的点默认为红色。然后再根据树的情况进行调整,使得树重新满足红黑树的定义和性质。

1. 当前结点的父结点是红色,且它的祖父结点的另外一个孩子(叔叔结点)也是红色

① 把父结点设为黑色;
② 把叔叔结点也设为黑色;
③ 把祖父结点设为红色;
④ 把指针定义到祖父结点,即把祖父结点设置为当前结点,继续向上操作;

2. 当前结点的父结点是红色,叔叔结点是黑色,且当前结点是右子树

以当前结点的父结点作为根 左旋

3. 当前结点的父结点是红色,叔叔结点是黑色,且当前结点是左子树

① 把父结点变为黑色;
② 把祖父结点变为红色;
③ 以祖父结点作为根结点 右旋

采用以下示例详细演示

原红黑树(以下所有红黑树省略NIL结点)
[数据结构]:红黑树_第2张图片
1. 插入一个新元素6
[数据结构]:红黑树_第3张图片
2. 适用变换规则1

将当前结点的父结点和叔叔结点变为黑色;祖父结点变为红色;
[数据结构]:红黑树_第4张图片

将指针定义到祖父结点
[数据结构]:红黑树_第5张图片

继续调整

3. 适用变换规则2

以当前结点的父结点为根结点旋转
[数据结构]:红黑树_第6张图片

继续调整

4. 适用变换规则3

将父结点变为黑色,祖父结点变为红色
[数据结构]:红黑树_第7张图片

以当前结点的祖父结点作为根结点有旋
[数据结构]:红黑树_第8张图片

5. 结束调整

检查当前红黑树不满足上面的3种调整规则,调整结束。满足红黑树的5个性质。
[数据结构]:红黑树_第9张图片

代码

你可能感兴趣的:(红黑树,数据结构,红黑树)