1 父子节点之间不能出现两个连续的红节点 2 任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等 */
| 174 | 2 任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等 |
| 175 | */ |
| 176 | void insertFixup(RBTreeNode* z) |
| 177 | { |
| 178 | // 处理父节点是红色,父子同为红色冲突了 |
| 179 | while (z->p->color == RED) { |
| 180 | // 父节点在左边 |
| 181 | if (z->p->isLeft()) { |
| 182 | // 找到叔叔 |
| 183 | auto y = z->p->brother(); |
| 184 | // case 1 |
| 185 | if (y->color == RED) { |
| 186 | // 父亲和叔叔都是红色,把他们都变成黑色 |
| 187 | z->p->color = BLACK; |
| 188 | y->color = BLACK; |
| 189 | // 把祖父变成红色 |
| 190 | z->p->p->color = RED; |
| 191 | z = z->p->p; |
| 192 | } else { |
| 193 | // case 2 |
| 194 | // 父亲是红色,叔叔是黑色 |
| 195 | if (z->isRight()) { |
| 196 | // z在右边就左旋,z指向父节点 |
| 197 | z = z->p; |
| 198 | // 左旋父节点 |
| 199 | leftRotate(z); |
| 200 | } |
| 201 | // case 3 |
| 202 | // 父亲设置为黑色 |
| 203 | z->p->color = BLACK; |
| 204 | // 把祖父变成红色 |
| 205 | z->p->p->color = RED; |
| 206 | // 右旋祖父节点 |
| 207 | rightRotate(z->p->p); |
| 208 | } |
| 209 | } else { |
| 210 | auto y = z->p->brother(); |
| 211 | // case 1 |
| 212 | if (y->color == RED) { |
| 213 | z->p->color = BLACK; |
| 214 | y->color = BLACK; |
| 215 | z->p->p->color = RED; |
| 216 | z = z->p->p; |
| 217 | } else { |
| 218 | if (z->isLeft()) { |
| 219 | // case 2 |
| 220 | z = z->p; |
| 221 | rightRotate(z); |
| 222 | } |
| 223 | |
| 224 | // case 3 |
| 225 | z->p->color = BLACK; |
| 226 | z->p->p->color = RED; |
| 227 | leftRotate(z->p->p); |
| 228 | } |
| 229 | } |
| 230 | } |
| 231 | root->color = BLACK; |
| 232 | } |
| 233 |