Поиск ошибок сегментации BST - PullRequest
1 голос
/ 09 апреля 2020

Я работаю над назначением BST и выполнил все реализации; однако, когда я вызываю функцию bool insert(int i), появляется segmentation fault(core dumped). Можете ли вы найти то, что я должен изменить, чтобы избавиться от этой ошибки?

const treenode* find( const treenode* n, int i ){
    if(n->val==i)
        return n;
    else if(n->val<i)
        return find(n->right, i);    //if our key is less than given node it goes to the left node through recursion function
    else if(n->val>i)
        return find(n->left, i);   //the same thing here, if it is bigger - it goes right through recursion
    else
        return n;
}

treenode** find( treenode** n, int i ){
    if((*n)->val==i)
        return n;
    else if((*n)->val<=i)
        return find(&((*n)->right), i);
    else if((*n)->val>=i)
        return find(&((*n)->left), i);
    else
        return n;
}const treenode* find( const treenode* n, int i ){
    if(n== nullptr)
        return n;
    else if(n->val==i)
        return n;
    else if(n->val>i)
        return find(n->left, i);    //if our key is less than given node it goes to the left node through recursion function
    else if(n->val<i)
        return find(n->right, i);   //the same thing here, if it is bigger - it goes right through recursion
}

treenode** find( treenode** n, int i ){
    if((*n)->val==i)
        return n;
    else if((*n)->val<=i)
        return find(&((*n)->right), i);
    else if((*n)->val>=i)
        return find(&((*n)->left), i);
    else
        return n;
}

bool set::insert( int i ) {
        treenode** res=find(&tr, i);
        if(*res==nullptr) {
            *res = new treenode(i);
            return true;
        }
        return false;
}

1 Ответ

0 голосов
/ 09 апреля 2020

Эта функция

treenode** find( treenode** n, int i ){
    if((*n)->val==i)
        return n;
    else if((*n)->val<=i)
        return find(&((*n)->right), i);
    else if((*n)->val>=i)
        return find(&((*n)->left), i);
    else
        return n;
}c

может вызывать неопределенное поведение, когда указатель *n равен nullptr, то есть, когда двоичное дерево поиска пусто.

Функция может выглядеть следующий способ

treenode ** find( treenode **n, int i )
{
    if ( *n == nullptr )
    {
        return n;
    }
    else if ( i < ( *n )->val )
    {
        return find( &( *n )->left, i );
    }
    else if ( ( *n )->val < i )
    {
        return find( &( *n )->right, i );
    }
    else
    {
        return n;
    }
}

и другая функция находят, что она должна быть постоянной функцией-членом, может выглядеть как

const treenode * find( treenode *n, int i ) const
{
    if ( n == nullptr )
    {
        return n;
    }
    else if( i < n->val )
    {
        return find( n->left, i );
    }
    else if( n->val < i )
    {
        return find( n->right, i );
    }
    else
    {
        return n;
    }
}

Я предполагаю, что конструктор, использованный в этом операторе

*res = new treenode(i);

устанавливает элементы данных left и right в nullptr.

...