У меня есть алгоритм фиксации дерева, который выполняет перекрашивание и ротацию, и я проверил это, когда удаляемый узел имеет 2 или 1 потомка. Но когда у них нет детей, я не знаю, что делать.
Поскольку я передаю в узел, который будет удален дочерние элементы, родительский элемент и независимо от того, является ли этот дочерний элемент левым или правым дочерним элементом, это не может работать, если левый и правый дочерние элементы равны NULL (так же, как никакие дочерние элементы)
Я полностью понимаю вставку для красных черных деревьев, но при удалении я не могу понять общую идею. Код, который был предоставлен, был от моего профессора, но на самом деле я хочу написать свою собственную версию, но я не так понимаю удаление, как для вставки
void RedBlackTree::rbDeleteFixUp (Node* child, Node* parent, bool isRightChild){
while (child != root && child->isBlack == true){
//Left child
if (isRightChild = false){
//Sibling
Node* sibling = parent->right;
if (sibling->isBlack = false){
sibling->isBlack = true;
child->parent->isBlack = false;
child = child->parent;
leftRotate(child);
sibling = child->parent->right;
}
if (sibling->left->isBlack == true && sibling->right->isBlack == true){
sibling->isBlack = false;
child = child->parent;
}
else{
if (sibling->right->isBlack == true){
sibling->left->isBlack = true;
sibling->isBlack = false;
rightRotate(sibling);
sibling = child->parent->right;
sibling->isBlack = child->parent->isBlack;
child->parent->isBlack = true;
sibling->right->isBlack = true;
child = child->parent;
leftRotate(child);
child = root;
}
}
}
else{
Node* sibling = parent->left;
if (sibling->isBlack = false){
sibling->isBlack = true;
child->parent->isBlack = false;
child = child->parent;
rightRotate(child);
sibling = child->parent->left;
}
if (sibling->right->isBlack == true && sibling->left->isBlack == true){
sibling->isBlack = false;
child = child->parent;
}
else{
if (sibling->left->isBlack == true){
sibling->right->isBlack = true;
sibling->isBlack = false;
leftRotate(sibling);
sibling = child->parent->right;
sibling->isBlack = child->parent->isBlack;
child->parent->isBlack = true;
sibling->left->isBlack = true;
child = child->parent;
rightRotate(child);
child = root;
}
}
}}
}
Задача ещё не решена.
Других решений пока нет …