未创建树
Tree not being created
当我调用函数 createBst() 时,程序在函数中终止。
我在函数后面放了一个打印语句,但它不是called.The下一个打印语句"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);
}
输出应该是 "terminated".
对于初学者来说,classes 应该在它们在 main 中使用之前定义。
这个函数
node* bst::newNode(int v){
node n1;
node* n=&n1;
n->val=v;
n->left=nullptr;
n->right=nullptr;
return n;
}
调用未定义的行为,因为它 returns 指针指向一个局部变量 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);
};
并且 class 节点应该是 class bst 的嵌套私有(或受保护)class。
此外,您还需要 class bst 的默认构造函数,它将 head 初始化为 nullptr,或者您必须在 class 定义中明确地将 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 );
}
当我调用函数 createBst() 时,程序在函数中终止。
我在函数后面放了一个打印语句,但它不是called.The下一个打印语句"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);
}
输出应该是 "terminated".
对于初学者来说,classes 应该在它们在 main 中使用之前定义。
这个函数
node* bst::newNode(int v){
node n1;
node* n=&n1;
n->val=v;
n->left=nullptr;
n->right=nullptr;
return n;
}
调用未定义的行为,因为它 returns 指针指向一个局部变量 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);
};
并且 class 节点应该是 class bst 的嵌套私有(或受保护)class。
此外,您还需要 class bst 的默认构造函数,它将 head 初始化为 nullptr,或者您必须在 class 定义中明确地将 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 );
}