【C++】红黑树

红黑树的概念

红黑树是一种二叉搜索树,单在每个节点上增加一个储存为表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而接近平衡。

近似平衡

在这里插入图片描述
最长路径不超过最短路径两倍近似平衡
在这里插入图片描述

红黑树的性质

1.每个节点不是红色就是黑色
2.根节点必须是黑色
在这里插入图片描述
3.如果一个节点是红色的,则它的两个孩子节点必须是黑色.任何路径都没有连续的红色结点
4.对于每个结点,从该节点到其所有的后代叶子结点的简单路径上,均包含相同数目的黑色结点。每条路径上黑色结点的数量相等
在这里插入图片描述
5.每个叶子结点都是黑色的(此处的叶子结点是指空结点,也就是NIL结点)
在这里插入图片描述

AVL树和红黑树的对比

在这里插入图片描述
性能是同一量级的,但是AVL树,控制严格平衡是付出代价的,插入和删除时需要进行大量的旋转。
在这里插入图片描述

红黑树新节点插入

所有插入的节点默认为红色

检测新节点是否破坏红黑树的性质

在这里插入图片描述
新节点最长路径没有超过最短路径的两倍没有连续的红色结点每条路径的黑色结点数量相同则不影响。
在这里插入图片描述
新增结点破坏了红黑树的性质。

情况一:cur为红,parent为红,grandfather为黑,uncle存在且为红

在这里插入图片描述

情况一,可能是一颗完整的树,也可能是一颗子树
在这里插入图片描述
如果grandfather是根,调整完成后需要讲grandfather改为黑色
如果grandfather是子树,grandfather一定有双亲,且grandfather的双亲如果是红色,需要继续向上调整
在这里插入图片描述
解决方式:讲parent和uncle改为黑,grandfather改为红,然后grandfather变为cur继续向上调整

情况二:cur为红,parent为红,grandfather为黑,uncle不存在或uncle存在且为黑

cur为红,parent为红,grandfather为黑,uncle不存在

如果uncle结点不存在,则cur一定是新插入的结点,因为如果cur不是新插入的结点,则cur和parent一定有一个结点的颜色是黑色,就不满足性质4:每条路径黑色结点个数相同
在这里插入图片描述
此上情况则需要旋转加变色
在这里插入图片描述

parent == grandfather->left;
cur == parent->left;

进行右单旋

grandfather->left = parent->right;
parent->right = grandfather;

然后改色

grandfather->color = RED;
parent->color = BLACK;
cur为红,parent为红,grandfather为黑,uncle存在且为黑

在这里插入图片描述
进行旋转加变色。
如果parent是grandfather的右孩子,cur为parent的右孩子,则针对parent做左单旋。
如果parent为grandfather的左孩子,cur为parent的左孩子,则针对parent进行右单旋。
在这里插入图片描述

uncle->color == BLACK;
grandfather->right == parent;
parent->right == cur;
grandfather->right = parent->left;
parent->left = grandfather

parent->color = BLACK;
grandfather->color = RED;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值