未创建树

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