Результатом этой программы в компиляторе gcc является ошибка сегментации (ядро сброшено). Что я делаю не так? - PullRequest
0 голосов
/ 09 октября 2019

Это реализация двоичного дерева поиска, и я хочу знать, что с ней не так?

#include<iostream>
using namespace std;

struct node
{
    int data;
    node *left;
    node *right;
};

class tree
{
    node *root;
public:
    tree()
    {
        root=NULL;
    }

void insert(node *root,int key)
{
    if(root==NULL)
    {
    root->data=key;
    root->left=NULL;
    root->right=NULL;
    }

    else if(key<root->data)
    {
        node *temp = new node;
        if(root->left==NULL)
        {
            root->left=temp;
            temp->left=NULL;
            temp->right=NULL;
        }
        else
        {
            insert(root->left,key);
        }
    }
    else
    {
        node *temp=new node;
        if(root->right==NULL)
        {
            root->right=temp;
            temp->left=NULL;
            temp->right=NULL;
        }
        else
        insert(root->right,key);
    }
}

void search(node *root,int key)
{
    if(root==NULL)
        cout<<"Tree is Empty";
    else if(root->data==key)
        cout<<"Match Found";
    else if(key<root->data)
        search(root->left,key);
    else
        search(root->right,key);
}

node* getHead()
{
    return root;
}
};

int main()
{
    tree a;
    a.insert(a.getHead(),5);
    a.insert(a.getHead(),3);
    a.insert(a.getHead(),9);
    a.insert(a.getHead(),11);
    a.insert(a.getHead(),7);
    a.search(a.getHead(),11);
    return 0;
}

Может быть, моя реализация имеет доступ к некоторой памяти, которую я не объявил. Я простосоздал функцию для вставки узла и функцию поиска, которая возвращает, если дерево пусто из соответствия найдено. Исправьте меня, что я делаю неправильно. Выходной результат в моем компиляторе g ++ - ошибка сегментации (Core Dumped).

1 Ответ

0 голосов
/ 09 октября 2019

Ваша проблема в этой части:

if(root==NULL)
{
    root->data=key;
    root->left=NULL;
    root->right=NULL;
}

Вы выполняете тест для root, равный NULL, затем вы переходите к доступу к членам root, что вызовет ошибку сегментации. Итак, по сути, код выполняет:

if(root==NULL)
{
    NULL->data=key;
    NULL->left=NULL;
    NULL->right=NULL;
}

В качестве заключительного замечания, лучше всего не передавать переменную с тем же именем, что и переменная-член, в функцию,Это делает код очень сложным для чтения и отладки. Итак, измените переменную «root» в «insert» и «search» на «checknode» или что-то в этом роде. Отладить ваш код будет намного проще.

...