【问题标题】:bst segmentation fault searchbst 分段故障搜索
【发布时间】:2020-04-09 13:16:05
【问题描述】:

我正在处理 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;
}

【问题讨论】:

  • @Swampy 目前还不清楚你有多少功能。:)
  • 另外,find 似乎没有修改n 参数,那么为什么**?
  • 在使用前不检查任何地方的 nullptr
  • @VladfromMoscow 我得到了两个查找功能,一个用于查找,一个用于插入和删除
  • @XSwampy 你永远只需要一个,即treenode* find(treenode* n, int);。这将涵盖所有情况,因为您永远不会在任何这些函数内的任何地方修改 pointer-to-treenode 实例。此外,这些函数只是为了使代码更长更难阅读,因为它们在技术上自然是相同的。

标签: c++ segmentation-fault binary-search-tree


【解决方案1】:

这个函数

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

和其他函数 find 应该是一个常量成员函数可以看起来像

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。

【讨论】:

  • 谢谢!现在它起作用了,来自哈萨克斯坦的特别尊重
  • @xSwampy To c;loose the question select the best answer.:)
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多