BST中的Segfault-Iterative插入

时间:2015-01-21 00:44:42

标签: c++ binary-search-tree

我正在尝试编写代码以迭代地在BST中插入新元素。当我尝试执行代码时,我得到一个段错误。有人可以查看代码并帮我纠正吗?

bool insert2(int item)
{
    BstNode *parent;
    BstNode *root=new BstNode;
    cout<<root->data;
    cout<<"\n";
    BstNode *ptr;
    int ctr=0;

    //cout<<root->data;
    if (root==NULL)
    {
        BstNode *temp=new BstNode;
        temp->data=item;
        temp->left=NULL;
        temp->right=NULL;
        root=temp;
        //cout<<root->data;
        return true;

    } 
    else
    {
        ptr=root;
        while (ptr!=NULL)
        {
            ctr=ctr+1;
            cout<<ctr;
            if (ptr->data==item)
            {
                cout<<ptr->data;
                return false;
            }

            if (item < ptr->data)
            {
                parent=ptr;
                ptr=ptr->left;

            } 
            else
            {
                parent=ptr;
                ptr=ptr->right;
            }

        }
        BstNode *add=new BstNode;
        add->data = item;
        add->left= NULL;
        add->right= NULL;
        return true;
    }
}

编辑出root-&gt;数据部分,代码将进入第一个if块并返回true,这让我猜测我的问题出在减速的某个地方。

1 个答案:

答案 0 :(得分:0)

有很多事情你做错了。首先,正如PaulMcKenzie指出的那样,你不应该在函数的开头创建根。如果BST没有开始为空,则根目录已经存在,您不想创建新的。相反,root应该是一个公共变量(只允许你有一个BST),或者该函数应该将指向root的指针作为参数之一。您创建根然后测试它以查看它是否为NULL当然没有意义。除非你内存不足,否则在你创建它之后就不会是NULL。

您的代码的另一个问题是,在BST中找到适当的位置后,您将创建新节点,但不要将其附加到树中。相反,您可能希望在初始化add之后插入以下行:

if(item < parent->data)
    parent->left = add;
else
    parent->right = add;

每次调用函数时都会出现seg-fault,这可能是因为,当您声明root时,您不会初始化其right和{{1指向NULL的指针。因此,while循环在到达leftroot->left时不会停止。当您尝试在循环中稍后使用root->right时,您将引用未初始化的指针,从而导致seg-fault。