1,红黑树特点
- 每一个结点都有颜色,要么红色,要么黑色。
- 根结点必须是黑色的。
- 红色结点的子结点必须是黑色的。
- 任何一个结点,到它所有叶子结点,经过相同个数的黑色结点。(红黑树的平衡含义,左右高度相差一倍以内就可以,但搜索性能仍然是log2(n))。
- 红黑树的高度最高不超过2log2(n+1)。
- null叶子节点是黑结点。
2,红黑树插入操作如何调整使得满足规则?
新插入的结点颜色为红色,先插入,再判断属于哪种类型。
先左旋相当于把新插入的结点改变了,再右旋,右旋后变色新插入的结点颜色不变,改变其他两个结点的颜色。
(表格中后4种情况黑色叔结点为null空结点)
红黑树插入删除动态演示网站
B站红黑树插入讲解视频
3,红黑树删除操作如何调整使得满足规则?
1. 二叉平衡树的删除调整
① 删除
<1> 要删除的结点是叶子结点,直接删除该结点。
<2> 要删除的结点有一个子结点,该子结点及其子树直接替换该节点。
<3> 要删除的结点左、右子结点都有,用该结点右子树中最小结点或者左子树最大结点替换该结点(后继或者前驱)。
② 调整
从被删除结点q开始,向上查找,找到第一个失衡结点。
<1> 如果平衡因子为-2(左低右高)
如果右孩子的平衡因子为-1,则做L型调整;
右孩子平衡因子为1,RL调整;
如果右孩子的平衡因子为0,L调整或者RL调整都可以。
<2> 如果平衡因子为2(左高右低)
左孩子平衡因子为-1,LR调整;
左孩子平衡因子为1,R调整;
左孩子的平衡因子是0,LR型或者R型都可以。
2. 红黑树的删除调整
B站红黑树删除操作讲解视频
① 删除-替代
转化成删除叶子结点。
② 旋转-变色
原则:以删除左叶子结点为例
<1>删除后以该删除结点父结点为根结点,到叶子结点如果有三阶,则要左旋。
<2> 要以原来有的黑结点高度为标准调整。
<3> 红色结点不能有一个单独的黑色叶子结点。
<4> 黑色结点不能有一个单独的黑色叶子结点。
<5>如果调整完后 黑结点高度比原来小1,要进一步调整。
4,红黑树和二叉平衡树比较?
- 如果增加、删除操作少,查询操作多,那使用二叉平衡树,二叉平衡树的查找效率高(log2(n))。
- 为什么hashtree当链表结点数超过8个链表变为红黑树:红黑树不像二叉平衡树一样对平衡要求高,其左右子树最高可以相差一倍(左子树全是黑色结点,右子树红、黑结点交错),但是查询效率和二叉平衡树都在一个数量级,log2(n)。