Дерево не создается - PullRequest
       13

Дерево не создается

2 голосов
/ 01 ноября 2019

Когда я вызываю функцию createBst (), программа завершается в функции.

Я помещаю оператор print после функции, но он не вызывается. Следующий оператор печати "terminated" не вызывается

int main(){
    bst b;
    b.createBst();
    std::cout<<"terminated"<<std::endl;
    return 0;
}
class node{
public:
    int val;
    node* left;
    node* right;
};

class bst{

public:
    node* head;
    void createBst();
    node* newNode(int val);

};

node* bst::newNode(int v){
    node n1;
    node* n=&n1;
    n->val=v;
    n->left=nullptr;
    n->right=nullptr;
    return n;
}

void bst::createBst(){
    head=bst::newNode(10);
    head->left=bst::newNode(11);
    (head->left)->left=bst::newNode(7);
    head->right=bst::newNode(9);
    (head->right)->left=bst::newNode(15);
    (head->right)->right=bst::newNode(8);
}

вывод должен быть «прекращен».

1 Ответ

3 голосов
/ 01 ноября 2019

Для начала классы должны быть определены до их использования в main.

Эта функция

node* bst::newNode(int v){
    node n1;
    node* n=&n1;
    n->val=v;
    n->left=nullptr;
    n->right=nullptr;
    return n;
}

вызывает неопределенное поведение, поскольку возвращает указатель ro на локальную переменную n1, которая не будетбыть живым после выхода из функции.

Функция может быть определена следующим образом

node* bst::newNode(int v)
{
    return new node { v, nullptr, nullptr };
}

Фактически функция может быть закрытой статической функцией-членом

class bst{
public:
    node* head;
    void createBst();

private:
    static node* newNode(int val);
};

И узел класса должен быть вложенным закрытым (или защищенным) классом класса bst.

Также вам необходим либо конструктор по умолчанию для класса bst, который инициализирует head в nullptr, либо вы должны явно инициализировать head вnullptr в определении класса, например

class bst{

public:
    node* head = nullptr;
    void createBst();

private:
    static node* newNode(int val);

};

Чтобы вставить данные в дерево, вы должны написать функцию, например, такую:

void insert( int value )
{
    node **current = &head;

    while ( *current != nullptr )
    {
        if ( value < ( *current )->val )
        {
            current = &( *current )->left;
        }
        else
        {
            current = &( *current )->right;
        }
    }

    *current = newNode( value );
}
...