大家好,我是小黄鸭,日常学习算法的Note。
概要
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。
一、红黑树的性质
- 每个结点不是红色就是黑色。
- 不可能有连在一起的红色结点。
- 根结点都是黑色root。
- 每个红色结点的两个子结点都是黑色,叶子结点都是黑色。
二、变换规则
旋转和颜色变换规则:所有插入的点都默认为红色
变颜色的情况
当前结点的父亲是红色,叔叔结点也是红色
- 把父亲结点设为黑色
- 把叔叔结点也设为黑色
- 把祖父结点设为红色(爷爷)
- 把指针定义到祖父结点设为当前要操作的,分析其需要的变换规则。
左旋
当前父结点是红色,叔叔结点是黑色的时候,且当前的结点是右子树。左旋以父节点作为旋转中心。
右旋
当前父结点是红色,叔叔是黑色的时候,且当前的结点是左子树
- 把父结点变为黑色
- 把祖父结点变为红色
- 以祖父结点作为旋转中心进行旋转。
总结
整体来说,对于红黑树具体了解不是很多,每次看到也只是想着下次一定去仔细学习一下,这次终于又机会学了了下,不过相对来说也只是红黑树的皮毛,只涉及到了基本的性质与构造,具体还有待更深入的学习。