Хорошо, это может показаться немного запоздалым, но я думаю, что я нашел более простое решение вашей проблемы, но не стесняйтесь доказать, что я ошибаюсь, если она верна, но это моя интерпретация описания алгоритма.
Ваши оригинальные строки:
}else if(z == z->getParent()->getRight()){
z = z->getParent();
rotateLeft(z);
}
if(z->getParent() != NULL){
z->getParent()->color = BLACK;
if(z->getParent()->getParent() != NULL){
z->getParent()->getParent()->color = RED;
rotateRight(z->getParent()->getParent());
}
}
Мое решение, которое может заменить эти конкретные строки, источник: CLRS
Логика: наличие блока if, вложенного в else, эквивалентно else if
[по крайней мере, так меня учили о других заявлениях if]
else
{
if ( z == z->parent->right)
{
z = z->parent;
rotateLeft(z);
}
if(z->parent != NULL)
{
if(z->parent->parent != NULL)
{
z->parent->parent->color = RED;
rotateRight(z->parent->parent);
}
}
}
parent = getParent ()
и т.д ...
Повторите то же самое для эквивалентного симметричного случая. Кроме того, вы могли бы использовать nil дозорного узла для эмуляции указателя NULL, но если у вашего класса Node есть конструкторы, тогда сравнение с NULL тоже подойдет, если вы не найдете способ обойти его.