使用void函数

时间:2017-06-15 10:43:04

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

我已经编写了两个用于插入二叉树的不同代码,一个可以正常工作,而另一个则没有。

这是我的节点的外观:

struct node
{
    int data;
    node *left;
    node *right;
};

以下是node* newnode(int a)

的代码
node* newnode(int a)
{
    node *temp=new node;
    temp->data=a;
    temp->left=nullptr;
    temp->right=nullptr;
    return temp;
}

以下是两个不同的插入代码:

这个返回指向节点的指针:

 node* insertion(node *root, int a)
 {
    if(root==nullptr)
        return newnode(a);
    else if(a<root->data)
        root->left=insertion(root->left, a);
    else
        root->right=insertion(root->right, a);
 }

这个返回void:

void insertion2(node *root,int a)
{
    if(root==nullptr)
        root=newnode(a);
    else if(a<root->data)
        insertion2(root->left,a);
    else
        insertion2(root->right,a);
}

返回void的那个不起作用。根据我的分析,在函数调用之后,root仍然是nullptr。任何人都可以解释我为什么不起作用?

5 个答案:

答案 0 :(得分:2)

请注意,在insertion版本中,您有root->left = insertion(root->left, a)root->right = insertion(root->right, a),但在insertion2中没有任何相同的效果。实际上,insertion2除泄漏内存外什么都不做。

答案 1 :(得分:1)

回答你的问题。

你的insert2函数的问题是root变量将在被调用的地方指向nullptr(NULL)并且分配一个新的内存并指向insert2()函数内的本地引用。对新内存位置的引用更改不会对引用@调用位置产生任何影响。正如其他人所指出的,这个调用总是会在@clearer answer中泄漏内存。

使此功能正常工作。移动对象创建部分@调用位置,只留下插入到此函数。

类似下面的内容应该有用。

void insertion2(node *root, node *new_node)
{
    if(root==nullptr)
        root=new_node;
    else if(a<root->data)
        insertion2(root->left,new_node);
    else
        insertion2(root->right,new_node);
}

// Create the new node and call the insert function
new_node = newnode(a);
insertion2(root, new_node);

希望它澄清你的疑问!

答案 2 :(得分:1)

第二个函数root中的

始终是局部变量,因此更新它不会更改主root变量,因为指针本身未通过引用传递。您可以通过引用调用来实现,只需更改您的 函数标题如下:void insertion2(node *&root,int a)

答案 3 :(得分:0)

这种方法在使用void返回类型时工作正常。声明一个全局变量,首先..如果要插入的节点是第一个,则将其设置为一个。然后将其更改为0。

void insertRoot(struct node* newnode){
    root=newnode;
}

void insert(struct node* root, int data)
{
    if(first==1){
            insertRoot(createNode(data));
            first=0;
    }else{
        if (data < root->data){
            if(root->left==NULL){
                root->left=createNode(data);
            }else{
                insert(root->left,data);
            }
        }
        else if (data > root->data){
            if(root->right==NULL){
                root->right=createNode(data);
            }else{
                insert(root->right,data);
            }
        }
    }
}

答案 4 :(得分:0)

调用方法中的根指针也需要更新。因此,您必须使用类似的方法来调用Insert2方法: Insert2(&BSTNodePtr,a)。当您传递变量BSTNodePtr的地址时,Insert2方法可以更新其内容。

尝试以下方法:

void Insert2(BSTNode **root, int a){
    if (*root==NULL){
        *root = new BSTNode(a);
    }
    else if (a<= (*root)->data){
        Insert2(&((*root)->left), a);
    }
    else{
        Insert2(&((*root)->right), a);
    }
}