1

そのため、新しいツリーを挿入した後に Splay 関数を実装することになりました。ただし、複数の int を挿入しようとすると、Segmentation Fault (core dump) と表示されて終了します。

誰でも私の問題がどこにあるかを確認できますか?

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);
                }
            }
        }

}
4

1 に答える 1

4

15 行目には、基本的に次のコード シーケンスがあります。

 if (parent != NULL) {
        ...

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

したがって、本質的に が でparentはないかどうかを確認しNULL、それが であるNULL場合はすぐにそれをparent->parent参照します ( )、基本的にこれを行っています:

Node* parent = NULL; *parent;

これは UB であり、segfault を引き起こす可能性が非常に高いです。

他にも一連の deferenceedparentsがあるので、関数の仕組みを再考する必要があると思います。

于 2014-12-05T16:52:04.637 に答える