红黑树是如何产生的呢?
我们先来看看红黑树的亲戚
二叉排序树
又叫二叉查找树和二叉搜索树
定义:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的结点。
查找算法
与二分法类似,将查找的关键字与树结点进行对比,大的往右小的往左,相同则成功查找。
步骤:
- 若根结点的关键字值等于查找的关键字,成功。
- 否则,若小于根结点的关键字值,递归查左子树。
- 若大于根结点的关键字值,递归查右子树。
- 若子树为空,查找不成功。
时间复杂度 O
- 平衡情况下,n个结点的二叉排序树的高度为logN+1,时间复杂度为O(logn),近似于二分法查找
- 不平衡情况下,其深度可达到n,时间复杂度为O(n),这时的二叉树则退化为线性表
为了解决二叉排序树退化成链表的问题,延伸出两种树:平衡二叉树、红黑树
平衡二叉树
它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
弊端: 过分追求平衡,理想状态,现实中实现的意义不大。
红黑树
-
节点是红色或黑色。
-
根节点是黑色。
-
每个叶子节点都是黑色的空节点(NIL节点)。
-
每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
-
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束强制了红黑树的关键性质:
- 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。
- 红黑树的树高(h)不大于两倍的红黑树的黑深度(bd),即h<=2bd
- 一棵拥有n个内部结点(不包括叶子结点)的红黑树的树高h<=2log(n+1)
红黑树的操作
-
因为每一个红黑树也是一个特化的二叉排序树,因此红黑树上的查找操作与普通二叉查找树上的查找操作相同。然而,在红黑树上进行插入操作和删除操作会导致不符合红黑树的性质。
-
恢复红黑树的属性需要少量(O(log n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。 虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次 。
红黑树的优势
红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。这一点是AVL所不具备的。
红黑树的恢复(自平衡)
红黑树恢复过程较为复杂,情况多种多样,主要的操作有三种:
- 颜色变换
- 左旋
- 右旋
在此就不过多介绍实现方法了。