未创建树

Tree not being created

本文关键字:创建      更新时间:2023-10-16

当我调用函数createBst((时,程序在函数中终止。

我在函数后面放了一个print语句,但它没有被调用。"终止"的下一个打印语句不称为

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);
}

输出应该"终止"。

对于初学者来说,类应该在主要使用之前定义。

此功能

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

调用未定义的行为,因为它返回一个局部变量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

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 );
}