Реализация Splay Tree на C ++

Поэтому я должен был реализовать функцию 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);
}
}
}

}

1

Решение

В строке 15 вы имеете следующую последовательность кода:

 if (parent != NULL) {
...

} else {
Node* gparent = parent->parent;

По сути, вы проверяете, parent не является NULLтогда, если это NULL ты сразу почитаешь это (parent->parent), вы, по сути, делаете это:

Node* parent = NULL; *parent;

Который является UB, и очень вероятно, вызовет segfault.

Есть также ряд других parents так что я думаю, вам нужно переосмыслить, как работает ваша функция.

4

Другие решения


По вопросам рекламы [email protected]