Для начала классы должны быть определены до их использования в 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 );
}