数据结构 -- 树形查找(三)红黑树
红黑树
为什么要发明红黑树
平衡二叉树AVL:插入/删除很容易破坏平衡性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),在进行LL/RR/LR/RL调整
红黑树RBT:插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即使需要调整,一般都可以在常数级时间内完成
平衡二叉树:适用于以查为主,很少插入/删除的场景
红黑树:适用于频繁的插入/删除的场景
大概会怎么考?
红黑树的定义和性质 – 选择题
红黑树的插入/删除 – 要能手绘插入过程(不太可能考代码),删除操作比较麻烦,也许不考
红黑树的定义和性质
红黑树的定义
struct RBnode{int key;RBnode* parent;RBnode* lchild;RBnode* rchild;int color; //结点颜色,如:可用0/1表示红/黑,也可以使用枚举型enum表示颜色
};
结点的黑高bh – 从某结点出发(不含该结点)到达任一叶结点的路径上黑节点的总数
红黑树的插入
插入方法
①先查找,确定插入位置(原理同二叉排序树),插入新结点
【与黑高bh相关的推论】
如果根结点的黑高为h,内部结点数(关键字)至少为多少个?
内部结点数最少的情况→总共h层黑结点的满树形态
若根结点黑高为h,内部结点数(关键字)至少有2h-1个
红黑树的删除
重要考点:
①红黑树删除操作的时间复杂度=O(log2n)
②在红黑树中删除结点的处理方式和“二叉排序树的删除’一样
③按②删除结点后,可能破坏“红黑树特性”,此时需要调整结点颜色、位置,使其再次满足“红黑树特性”。