Cplay树的C ++实现

时间:2014-12-05 15:52:50

标签: c++ splay-tree

所以我在插入新树后实现了Splay功能。但是,当我尝试插入多个int时,它会显示Segmentation Fault(核心转储),然后退出。

任何人都可以查看我的问题所在吗?

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 个答案:

答案 0 :(得分:4)

在第15行,你基本上有以下代码序列:

 if (parent != NULL) {
        ...

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

所以基本上你要检查parent是不是NULL,如果它是NULL你立即推崇它(parent->parent),你基本上是这样做的:

Node* parent = NULL; *parent;

哪个是UB,很可能导致段错误。

还有一系列其他引用的parents,所以我认为你需要重新思考你的功能如何运作。