Ошибка сегментации при вставке в дерево двоичного поиска - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь построить базовое c Бинарное дерево поиска в C ++ и сталкиваюсь с некоторыми проблемами, особенно когда я пытаюсь вставить узел через функцию и читать, это вызывает ошибку сегментации. Но та же самая структура узла прекрасно работает, когда я вставляю ее вручную. Код для вставки BST выглядит следующим образом и, скорее всего, является виновником:

void BST::insert(Node* temproot,int val){
  // std::cout << root->value <<std::endl;
  if(!temproot){  
    Node* newNode = new Node;
    newNode->value = val;
    temproot = newNode;
    std::cout << "Added Node with Value: " << val << std::endl;
    return;
  }
  if(val<(temproot->value)){
    std::cout << "LEFT" << std::endl;
    insert(temproot->left, val);
  }else{
    std::cout << "RIGHT" << std::endl;
    insert(temproot->right, val);
  } 
}

Структура узла выглядит следующим образом:

struct Node{
  int value;
  Node* left = nullptr, *right = nullptr;
};

А класс BST выглядит примерно так:

  class BST{
  public:
  Node* root= new Node;
    BST(int val){      

      root->value = val;
    }
    void insert(Node*,int val);
    void insertStart(int vasl){
      Node* temproot = root;
      insert(temproot, vasl);
    }
    void print(Node*);
    void _print(){
      print(root);
    }
};

Когда я пытаюсь напечатать его следующим образом, это вызывает ошибку сегментации:

void BST::print(Node* temp){
  std::cout << temp->value << std::endl;
  temp = temp->left;
  std::cout << (temp->value) << std::endl;
}

Я немного новичок в C ++, и у меня возникла проблема с наведением указателя на пару дней. Может ли кто-нибудь помочь мне понять, что я делаю здесь неправильно?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Функция обрабатывает копию переданного ей указателя на узел. Таким образом, изменение копии не влияет на исходный указатель.

Вы должны передать указатель на узел функции по ссылке. Объявление функции может выглядеть следующим образом

void insert(Node* &temproot,int val);

и вызываться как

void insertStart(int vasl){
  insert( root, vasl );
}

без промежуточного указателя.

И вы должны объявить эту функцию как проват stati c функция класса.

И инициализация элемента данных root с помощью nullptr.

Например

  class BST{
  public:
  Node* root = nullptr;

    BST(int val){      

      insert( root, val );
    }
    void insertStart(int vasl){
      insert( root, vasl);
    }
    void print(Node*);
    void _print(){
      print(root);
    }

private:
    static void insert(Node* &,int val);
};
1 голос
/ 31 января 2020

По сути, SEGFAULT происходит от функции print, которая должна выглядеть следующим образом:

void BST::print(Node* temp){
    if (nullptr == temp) {
        return;
    }

    print(temp->left);
    std::cout << temp->value << std::endl;
    print(temp->right);
}

А ваша функция insert должна выглядеть следующим образом:

void BST::insert(Node *&temproot,int val){
    if(nullptr == temproot){  
        Node* newNode = new Node;
        newNode->value = val;
        temproot = newNode;
        return;
    }
    if(val < (temproot->value)){
        insert(temproot->left, val);
    }else{
        insert(temproot->right, val);
    } 
}

Проверьте это живой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...