C++ 在BST中插入节点时出现逻辑错误

C++ 在BST中插入节点时出现逻辑错误,c++,tree,C++,Tree,我已经为BST编写了一个节点插入代码,但它似乎无法正常工作。它给出了一个“分割错误”。这是我的插入逻辑 void insert(Node* root, int data){ if(root==NULL){ root= new Node; root->data = data; } else if(data < root->data){ insert(root->left,data); }

我已经为BST编写了一个节点插入代码,但它似乎无法正常工作。它给出了一个“分割错误”。这是我的插入逻辑

    void insert(Node* root, int data){
     if(root==NULL){
      root= new Node;
      root->data = data;
      }
    else if(data < root->data){
      insert(root->left,data);
      }
    else if(data> root->data){
      insert(root->right,data);
      }
    }
void插入(节点*根,int数据){
if(root==NULL){
根=新节点;
根->数据=数据;
}
else if(数据data){
插入(根->左,数据);
}
else if(数据>根目录->数据){
插入(根->右,数据);
}
}
我怎么修理它?谢谢

编辑:所以我尝试了一些东西,这一个就成功了

    Node* insert(Node* &root, int data){
    if(root==nullptr){
    root = create(data);
    return root;
    }
    else if(data < root->data){
    insert(root->left,data);
    }
    else if(data> root->data){
    insert(root->right,data);
    } 
    }
Node*插入(Node*&根,int数据){
if(root==nullptr){
根=创建(数据);
返回根;
}
else if(数据data){
插入(根->左,数据);
}
else if(数据>根目录->数据){
插入(根->右,数据);
} 
}

Node*root和Node*&root之间有什么区别?

好吧,如果Node不存在(它是
NULL
),您只需将
root
指针设置为
新节点
,但缺少将其挂起到其父节点的功能。如前所述,您可以使用
unique\u ptr
-s,因为
C++11
可以避免内存泄漏(当您忘记删除对象时)。它看起来像:

struct Node {
    int data = -1;  // not initialized
    std::unique_ptr<Node> l;
    std::unique_ptr<Node> r;
}

void insert(Node *root, int data) {
    if (root->data == -1) {
        root->data = data;
        return;
    }
    if (data < root->data) {
        if (!root->l) {
            // hanging new left node up
            root->l = std::make_unique<Node>();  // std::make_unique comes since C++14
        }
        insert(root->l.get(),  // getting raw ptr
               data);
    }
    else {
        if (!root->r) {
             // hanging new right node up
             root->r = std::make_unique<Node>();
        }
        insert(root->r.get(), data);
    }
}
1
 \                  
  2                 <=
   \                <= very long path
    3               <=
     \
     ...
       \
     100'000
struct节点{
int data=-1;//未初始化
std::唯一的ptr l;
std::唯一的\u ptr;
}
无效插入(节点*根,整数数据){
如果(根->数据==-1){
根->数据=数据;
返回;
}
如果(数据<根->数据){
如果(!root->l){
//挂起新的左节点
root->l=std::make_unique();//std::make_unique是从C++14开始的
}
插入(root->l.get(),//获取原始ptr
数据);
}
否则{
如果(!root->r){
//挂起新的右节点
根->r=std::使_唯一();
}
插入(根->r.get(),数据);
}
}
此外,您可能会对名为的数据结构感兴趣,因为如果插入(例如)递增序列,您的实现可能会工作很长时间:

Node root;

for (int i = 1; i <= 100'000; i++) {
    insert(&root, i);
}
节点根;

对于(int i=1;i首先,您应该使用
nullptr
而不是
NULL
。其次,您确定
left
right
字段的初始化正确吗?第三,考虑使用
unique\u ptr
而不是裸指针这里没有足够的内容来给出明确的答案。它在哪里崩溃?在
插入中
,或者在
插入
调用之后?您正在分配给本地
变量,因此不会将任何更改传播回调用方。关于您的编辑:差异与
int x
int&x
之间的差异相同。指针没有什么特殊之处。
节点*a
之间的差异>Node*&b
是指刷新节点父节点的
l
r
指针(在我的“挂起”中)。就像您有
void f(int a){a=5;}
void g(int&a){a=5;}
一样,在调用
f(x)
x
后,它仍然存储以前的值,但在
g(x)之后
x
存储
5