C++ 在二叉搜索树中插入新元素

C++ 在二叉搜索树中插入新元素,c++,data-structures,binary-search-tree,C++,Data Structures,Binary Search Tree,我试图在二元搜索树中插入一个新元素,我编写了以下函数,但它似乎不起作用,我似乎无法理解为什么 代码: node*新节点(int数据) { node*ptr=新节点(); ptr->data=数据; ptr->left=NULL; ptr->right=NULL; 返回ptr; } 空插入(节点*根,int d) { if(root==NULL) 根=新的_节点(d); 否则如果(ddata) 插入(根->左,d); 其他的 插入(根->右,d); } 将对象传递给函数时,函数会收到一个值的副本作

我试图在二元搜索树中插入一个新元素,我编写了以下函数,但它似乎不起作用,我似乎无法理解为什么

代码:

node*新节点(int数据)
{
node*ptr=新节点();
ptr->data=数据;
ptr->left=NULL;
ptr->right=NULL;
返回ptr;
}
空插入(节点*根,int d)
{
if(root==NULL)
根=新的_节点(d);
否则如果(ddata)
插入(根->左,d);
其他的
插入(根->右,d);
}

将对象传递给函数时,函数会收到一个值的副本作为参数。修改值的副本对原始对象没有影响(至少在指针等基本类型的情况下是如此。这不适用于具有内部间接寻址的“引用”类)

为了修改函数之外的对象,需要使用间接寻址。自从传递指针以来,您已经有了一个间接层。通过指针参数间接指向,可以修改函数外部的节点。但分配指针并不是试图修改指向的节点。它试图修改指针。但是指针是一个副本,因此赋值对函数外部没有影响

因此,您需要第二层间接寻址:向指针传递一个引用,这样分配指针将修改引用的指针而不是副本。另一种方法是使用返回值,如所示。请注意,这会稍微改变调用函数的方式。

试试这个-

node* insert(node* root,int d)
{
    if(root==NULL)
        root = new_node(d);
    else if(d<root->data)
        root->left = insert(root->left,d);
    else
        root->right = insert(root->right,d);
    return root;
}
节点*插入(节点*根,int d)
{
if(root==NULL)
根=新的_节点(d);
否则如果(ddata)
根->左=插入(根->左,d);
其他的
根->右=插入(根->右,d);
返回根;
}

root=新节点(d)修改本地
参数。它不会修改调用者传递给
insert
例程的参数。这不适用于添加子项。应该是
root->left=insert(root->left,d)
根->右=插入(根->右,d)谢谢你发现我的错误。更正了。:)
node* insert(node* root,int d)
{
    if(root==NULL)
        root = new_node(d);
    else if(d<root->data)
        root->left = insert(root->left,d);
    else
        root->right = insert(root->right,d);
    return root;
}