一、红黑树简介
1972年Rudolf Bayer发明,称为平衡二叉B树(symmetric binary B-trees),在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为“红黑树”,一种特化的AVL树,在插入和删除时通过特定操作保持二叉查找树的相对平衡,从而获得较高的查找性能。
红黑树不是严格的AVL树,只是黑色平衡,如上图所示,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的。
二、红黑树特点
符合二叉搜索树基本特性,同时具备以下特性:
- 节点非黑即红 (每个节点要么是黑色,要么是红色)
- 其根节点是黑色
- 叶子节点是黑色(为了简单期间,一般会省略该节点)
- 相邻节点不同为红色(红色节点的子节点必是黑色)
- 从一个节点到该节点的下叶子节点的所有路径上包含的黑节点数量相等(这一点是平衡的关键)
口决:黑根黑叶红不邻,同祖等高只数黑
三、红黑树接口方法
- 查找节点
- 左旋
- 右旋
- 插入节点
• 七种情况处理
• 五种情况需要考虑自平衡 - 删除节点
• 五种情况处理
• 两种情况需要考虑自平衡(又细分八种情况,其中四种为镜像情况)
四、插入节点的七种情况
4.1 情况1
树为空直接创建红黑树
4.2 情况2
父节点为黑,直接添加子节点即可。子节点默认为红色节点。这种情况天生平衡。
4.3 情况3
父节点为红色、叔伯为红色。
4.4 情况4
父节点红色,叔伯黑色,爷爷、父亲、新节点形成ㄑ型
4.5 情况5
父节点红色,叔伯黑色,爷爷、父亲、新节点形成 / 型
4.6 情况6
父节点红色,叔伯黑色,爷爷、父亲、新节点形成 〉型
4.7 情况7
父节点红色,叔伯黑色,爷爷、父亲、新节点形成 \ 型
五、删除节点
查找位置、找替代节点、自平衡、真正删除
六、红黑树节点代码
class RBTreeNode {
public int value;
public boolean isRed;
public RBTreeNode left;
public RBTreeNode right;
public RBTreeNode parent;
public RBTreeNode(int value) {
this.value = value;
this.isRed = true;
}
public RBTreeNode(int value, boolean isRed) {
this.value = value;
this.isRed = isRed;
}
// public boolean isRed() {
// return isRed;
// }
public boolean isBlack() {
return !isRed;
}
}
七、红黑树的实现
7.1 查找节点
public RBTreeNode find(int value) {
RBTreeNode node = root;
//根据二叉搜索树的特点进行 查找
while (node != null) {
if (value == node.value) {
//找到节点,返回