【问题标题】:inserting a new element in a binary search tree在二叉搜索树中插入一个新元素
【发布时间】:2020-01-08 15:18:25
【问题描述】:

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

代码:

node* new_node(int data)
{
    node* ptr=new node();
    ptr->data=data;
    ptr->left=NULL;
    ptr->right=NULL;
    return ptr;
}
void insert(node* root,int d)
{
    if(root==NULL)
        root=new_node(d);
    else if(d<root->data)
        insert(root->left,d);
    else
        insert(root->right,d);
}

【问题讨论】:

  • root=new_node(d); 修改本地 root 参数。它不会修改调用者传递给insert 例程的参数。

标签: c++ data-structures binary-search-tree


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个-

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

    【讨论】:

    • 这不适用于添加孩子。应该是root-&gt;left = insert(root-&gt;left,d);root-&gt;right = insert(root-&gt;right,d);
    • 感谢您指出我的错误。更正了它。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多