跳转至

红黑树

约 495 个字 预计阅读时间 2 分钟

基本原则

  1. 前提:二叉搜索树(左根右)
  2. 根和叶子(NULL)都是黑色(根叶黑)
  3. 叶子节点若为红色,那它的孩子一定是黑色(不红红)
  4. 任意节点到叶子的所有路径上黑色节点数量相同(黑路同)
  5. 红黑树最长路径不超过最短路径的两倍

插入

  • 规定插入节点默认为红色

插入的是根节点

  • 直接变黑就可以了

插入节点的叔叔是红色

  • 对父亲,叔叔,爷爷三个节点变色,然后让爷爷变插入节点
  • 继续判定属于哪种情况,继续调整

插入节点的叔叔是黑色

  • (LL,RR,LR,RL)旋转,然后对最后一次的旋转点和被绕着转的点变色

删除

删除节点只有左/右孩子

  • 代替后直接变黑

删除节点没有孩子

删除节点为红节点

  • 无需任何调整

删除节点为黑节点

  • 首先变成双黑节点,然后根据兄弟的情况进行变色、旋转,消除双黑节点
兄弟是黑色
兄弟至少有一个红孩子(记孩子为r,兄弟为s,父亲为p)
  • LL型,r变s(颜色),s变p,p变黑,然后进行旋转
  • RR型,r变s(颜色),s变p,p变黑,然后进行旋转
  • LR型,r变p,p变黑,然后左旋再右旋
  • RL型,r变p,p变黑,然后右旋再左旋
  • 最后把双黑节点变回单黑
兄弟的孩子都是黑色
  • 兄弟变红,双黑上移(如果父节点为黑色,父节点变为双黑;如果父节点为红色,双黑遇红直接变单黑),然后再套用前面的情况继续调整.

    如果双黑遇到根节点,直接变单黑就可以了

兄弟是红色
  • 兄父变色,朝双黑旋转,然后根据兄弟的情况继续调整

评论