运行失败/分段故障binaryTree C

Run failed/segmentation fault BinaryTree c++

本文关键字:binaryTree 故障 分段 失败 运行      更新时间:2023-10-16

,所以我发现我的插入方法有一个问题会导致分割故障,但不知道何处或如何解决。

我的插入方法就是这样:

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

whye empty((为返回root == nullptr;

也是我的主要.cpp,其中引起了问题:

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

如果无论如何都会共享完整的代码,那么代码有几个错误,

segfault很可能发生,因为以下语句将永远是错误的基本案例永远不会满足,然后代码在下面并使用null指针,因为下面的条件是错误的:

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

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

null指针被用作代码到达此处的代码,即使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);

如果您已经在构造函数中分配了一个有效的对象,则忽略新的对象,但要保持突破。我希望您将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;
}

如果空((为返回root == nullptr;这意味着,当您的树是空的时,您无法打电话NULL指针上的setElement(num(。您首先需要初始化它。诸如root = new root_type((之后,之后设置了相应的值。