著名的黑平衡BST——红黑树(Red Black Tree)

设计背景

AVL树通过严格的平衡因子制度来触发自平衡操作,它是一种高度平衡的BST,在数据的查询上有着显著的优势,但在某些场景下,过于频繁的自平衡操作可能会带来多余的时间消耗。
在树领域中还有一种著名的自平衡BST——红黑树(Red Black Tree),它通过特殊的机制来降低自平衡触发的次数,以牺牲平衡性来节省开销,其属于弱平衡的BST。
红黑树是一种综合性能折中的选择,适合增删改查等多重操作发生的情况。
在这里插入图片描述


结构分析

【结构类型】树形结构
【底层实现】Node模型(key+value+左指针+右指针)
【核心方法】
public void add(K key, V value); //向AVL树添加元素
private Node leftRotate(Node y); //左旋转
private Node rightRotate(Node y); //右旋转
private void flipColors(Node node); //颜色翻转
【基本性质】

  1. 每一个节点非黑即红
  2. 整棵树的根节点是黑色的
  3. 所有叶子节点都是黑色的
  4. 如果一个节点是红色的,那么它的两个子节点都是黑色的
  5. 从任意一个节点到叶子节点,所经过的黑色节点数是相等的

平衡策略

本文以左倾红黑树为标准进行举例

1. 左旋转

在这里插入图片描述
代码演示:

// 旋转节点
y.right = x.left;
x.left = y;
// 更新颜色
x.color = y.color;
y.color = RED;
2. 右旋转

在这里插入图片描述

// 右旋转
z.left = x.right;
x.right = z;
// 更新颜色
x.color = z.color;
z.color = RED;
3. 颜色翻转

在这里插入图片描述
代码演示:

x.color = RED;
x.left = BLACK;
x.right = BLACK;

平衡机制

当插入新元素时,将检测是否符合自平衡条件:
在这里插入图片描述
代码演示:

// 如果当前节点为红色,并且当前节点的左子树为黑色,触发左旋转
if (isRed(node.right) && !isRed(node.left)) {
	node = leftRotate(node);
}
// 如果当前节点的左子树为红色,并且当前节点的左子树的左子树也为红色,触发右旋转
if (isRed(node.left) && isRed(node.left.left)) {
	node = rightRotate(node);
}
// 如果当前节点的左右子树均为红色,触发颜色翻转
if (isRed(node.left) && isRed(node.right)) {
	flipColors(node);
}

(附:由于红黑树删除节点的情况十分复杂,其思想也不具备延展性,故本文不涉及删除等其它操作的演示,详细设计可参考《算法导论》或其它博客)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值