文章目录
红黑树(英语:Red–black tree)是一种 自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",它现代的名字源于Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文。红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中高效:它可以在 O(log n)时间内完成查找、插入和删除,这里的n是树中元素的数目。
红黑树性质(算法导论)
- 每个结点或是红色的,或是黑色的。
- 根结点是黑色的。
- 每个叶子结点(NIL)是黑色的。
- 如果一个结点是红色的,则它的两个子结点都是黑色的。
- 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(黑高)。
红黑树插入
红黑树插入结点必须标记为红色,我们首先以二叉查找树的方法增加节点并标记它为红色。当插入结点以后,可能会影响到红黑树的性质,这时需要通过变色或者旋转来进行平衡。如果插入结点存在相同结点,则只需要替换值即可,此时不影响红黑树性质。
插入结点
以二叉查找树的方式插入新节点。
插入新节点代码:
public void insert(T key) {
// 根节点,直接插入
if (root == null) {
root = new Node<>(key);
} else {
// 当前循环节点
Node<T> x = root;
// 最后一个循环的节点
Node<T> p = x;
while (x != null) {
p = x;
int tmp = key.compareTo(x.key);
// key比x大,插入到右子树
if (tmp > 0) {
x =