运行失败/分段错误BinaryTree c ++

时间:2017-04-27 17:36:11

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

所以我发现我的插入方法存在问题,导致分段错误,但不知道在何处或如何解决它。

我的插入方法是这样的:

NodeTree* BinarySearchTree::insert(NodeTree *node,int element){
    NodeTree *current;

    if(empty()){
        root->setElement(element);  //Si es null creem l'arrel i la retornem
        root->setParent(current);     
        return root;             
    }
    if(node!=nullptr){
        current=node;      //Si el node no és null l'igualem amb un auxiliar 
                           //que despres serà retornat segons el contigut del node
    }
    if(element<=node->getElement()){
        current=node;                                      //els elements més petits a l'esquera
        node->setLeft(insert(node->getLeft(),element)); // crida recursiva
    }
    else{
        current=node;                                       // elements més grans a la dreta
        node->setRight(insert(node->getRight(),element));//crida recursiva
    }


    return node; //un cop fet el procediment anterior retorna el node

其中empty()返回root == nullptr;

也是导致问题的main.cpp:

case 1:
    cout<<"Numero a afegir: "; cin>>num; cout<<""<<endl;
    if(tree.empty()){
       root->setElement(num);
    }
    tree.insert(root,num);
    break;

2 个答案:

答案 0 :(得分:0)

如果empty()返回root == nullptr; 这意味着当你的树空了,你不能打电话 空指针上的setElement(num)。你需要先初始化它。 像root = new root_type()之类的东西,之后设置相应的值。

答案 1 :(得分:0)

如果完整的代码已被共享会更好,无论如何代码都有错误,

Segfault发生的可能性很大,因为以下语句永远都是假基本情况永远不会满足,然后代码转到下面并使用空指针,因为下面的条件是错误的:

if(empty()){
        root->setElement(element);  //Si es null creem l'arrel i la retornem
        root->setParent(current);     
        return root;             
    }

以上检查root == nullptr将始终为false,删除上述代码并按照我在下面提到的更新方式更新如何设置基本情况。

即使node为null,

用作代码的空指针也会到达此处:

if(element<=node->getElement()){ 

getElement将被调用,节点为null,如上所述,检查root == nullptr而不是它应该检查node == nullptr

主要的还有你应该广告破坏陈述和新陈述,这很可能也可能是分段错误的原因,如下所述:

if(tree.empty()){
       root = new TreeNode;
       root->setElement(num); 
       break;
    }
    tree.insert(root,num);

如果您已在构造函数中为root分配了一个有效对象,则忽略new但保留中断。我希望你在构造函数中将TreeNode的左右子项设置为nullptr。

您还在下面的行中设置悬空指针:

root->setParent(current);

current指针尚未分配任何值,我相信你想要在current的上一个函数调用中检索值集,然后你应该current静态如下:

static NodeTree *current;

基本情况应写成如下:

if (node == nullptr)
{
        node = new NodeTree;
        node->setElement(element);  //Si es null creem l'arrel i la retornem
        node->setParent(current);     
        return node;
}

由于您没有共享完整代码,因此您的代码可能会出现更多问题,以下是BST插入的示例:

#include <iostream>

using namespace std;

class BstNode {

    public:
        int data;
        BstNode* left, *right;

        BstNode()
        {
            left = nullptr;
            right = nullptr;
        }
};

class Bst {
    private:
        BstNode* root;

    public:
        Bst()
        {
            root = nullptr;
        }

        void insert(int element)
        {
            root = insert(root, element);
        }

        BstNode* insert(BstNode* node, int element)
        {
            if (node == nullptr)
            {
                node = new BstNode;
                node->data = element;
            }

            else if (root->data > element)
            {
                node->left = insert(node->left, element);
            }

            else
            {
                node->right = insert(node->right, element);
            }

            return node;
        }

        void print()
        {
            print(root);
        }

        void print(BstNode* root)
        {
            if (root == nullptr)
                return;

            cout << root->data << " ";
            print(root->left);
            print(root->right);
        }
};

int main()
{
    Bst bst;
    bst.insert(6);
    bst.insert(3);
    bst.insert(8);
    bst.insert(2);
    bst.insert(7);
    bst.insert(4);

    bst.print();

    return 0;
}