Поэтому я должен был реализовать функцию Splay после вставки нового дерева. Тем не менее, когда я пытался вставить несколько целых, он говорит, что ошибка сегментации (дамп ядра) завершается.
Кто-нибудь может проверить, где моя проблема?
void SplayTree::splay(Node* node)
{
if (node == NULL)
return;
while (node!=NULL) {
Node* parent = node->parent;
if (parent != NULL) {
if (parent->left == node) {
rightRotate(parent);
} else {
leftRotate(parent);
}
} else {
Node* gparent = parent->parent;
if (parent->left == node && gparent->left == parent) {
rightRotate(gparent);
rightRotate(node->parent);
} else if (parent->right == node &&
gparent->right == parent) {
leftRotate(gparent);
leftRotate(node->parent);
} else if (parent->left == node &&
gparent->right == parent) {
rightRotate(parent);
leftRotate(node->parent);
} else {
leftRotate(parent);
rightRotate(node->parent);
}
}
}
}
В строке 15 вы имеете следующую последовательность кода:
if (parent != NULL) {
...
} else {
Node* gparent = parent->parent;
По сути, вы проверяете, parent
не является NULL
тогда, если это NULL
ты сразу почитаешь это (parent->parent
), вы, по сути, делаете это:
Node* parent = NULL; *parent;
Который является UB, и очень вероятно, вызовет segfault.
Есть также ряд других parents
так что я думаю, вам нужно переосмыслить, как работает ваша функция.