红黑树(上)

Posted by boyli on March 8, 2021

#

红黑树(上)

一、平衡条件

  1. 节点非黑既红
  2. 根节点是黑色
  3. 叶子(NIL)结点是黑色
  4. 红色节点下面接两个黑色节点
  5. 从根节点到叶子结点路径上,黑色节点数量相同

平衡条件的认识

第4条和第5条条件,注定了,红黑树中最长路径是最短路径的长度的 2 倍。

本质上,红黑树也是通过树高来控制平衡的。

红黑树比 AVL 树树高控制条件要更松散,红黑树在发生节点插入和删除以后,发生调整的概率,比 AVL 树要更小。

二、学习诀窍

  1. 理解红黑树的插入调整,要站在==祖父节点==向下进行调整
  2. 理解红黑树的删除调整,要站在==父节点==向下进行调整
  3. 插入调整,主要就是为了解决双红情况
  4. 新插入的节点一定是红色,插入黑色节点一定会产生冲突,违反条件5,插入红色节点,不一定产生冲突
  5. 把每一种情况,想象成一棵大的红黑树中的局部子树
  6. 局部调整的时候,为了不影响全局,调整前后的路径上黑色节点数量相同

三、插入策略

  1. 叔叔节点为红色的时候,修改三元组小帽子,改成红黑黑
  2. 叔叔节点为黑色的时候,参考 AVL 树的失衡情况,分成 $LL,LR,RL,RR$, 先参考 AVL 树的旋转调整策略,然后再修改三元组的颜色,有两种调整策略:红色上浮,红色下沉。
  3. 两大类情况,包含 8 种小情况

四、代码演示

  1. 插入调整,发正在递归的回溯阶段
  2. 插入调整代码中,使用 goto 语句,8行代码,变成了4行
  3. 处理根节点一定是黑色,通过代码封装,$insert->__insert$