如何插入二进制搜索树

时间:2015-04-14 06:40:20

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

我试图插入二进制搜索树中的所有内容都会编译但是当我尝试运行程序时,我得到Segmentation fault (core dumped)一切看起来都很好,我找不到问题。请帮助。

int main()
{
struct node
{
  int item;
  node *left;
  node *right;
};

node * root = NULL;
int x = 9;

void BinarySearchTree::insert(x)
{
   insert(x, root);
}

void insert(x, node *t)
{

    if(t == NULL)
    {
        t-> item = x;   
        t->left = NULL;
        t->right = NULL;
    }

    else if(x < t-> item)
    {
        insert(x, t->left);
    }
    else if(t->item < x)
    {
        insert(x, t->right);
    }
    else
    {
    ;//do nothing
    }
} 
}

2 个答案:

答案 0 :(得分:3)

如果指针为null,则尝试通过它间接设置不存在的节点的值。这将导致你的段错误。

您可能希望通过引用获取参数,因此您可以根据需要更新它以指向新节点:

void insert(x, node *&t)
{  //                ^
    if (t == nullptr) {
        t = new node {x, nullptr, nullptr};
    }
    // the rest of the function should work as it is
} 

答案 1 :(得分:1)

这个问题是不完整的,如果没有背景,就很难准确回答。话虽如此,代码中有些内容似乎不健康。

void insert(x, node *t){}

函数接受一个值,以及指向已分配结构的指针。 如果你把它的一个 null 值,而不是一个指向已分配结构的指针,你的代码将尝试将值赋给 null-&gt; item ,它仍然是。所以这会给你一个分段错误。

if(t == NULL)
{
    t-> item = x;   
    t->left = NULL;
    t->right = NULL;
}

当没有将指针指向先前分配的结构时,你必须决定做什么。

,抛出异常,或自动创建一个新对象(分配结构),然后分配值。

请注意,如果您执行后者,则需要返回指针的地址或更改参数以成为指针的引用...