MCPcopy Create free account
hub / github.com/acm-clan/algorithm-stone / insertFixup

Method insertFixup

templates/red-black-tree.cpp:176–232  ·  view source on GitHub ↗

1 父子节点之间不能出现两个连续的红节点 2 任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等 */

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 3

isLeftMethod · 0.45
brotherMethod · 0.45
isRightMethod · 0.45

Tested by

no test coverage detected