繁体   English   中英

为什么在二进制树中为插入操作传递“ T *&root”?

[英]Why is “T *&root” being passed for insert operation in a binary tree?

我正在创建一个自定义二进制树,并且偶然发现了以下代码,以便从该站点正确插入该树中。

void treeInsert(TreeNode *&root, string newItem) {
    if ( root == NULL ) {
        root = new TreeNode( newItem );
        return;
    }
    else if ( newItem < root->item ) {
        treeInsert( root->left, newItem );
    }
    else {
        treeInsert( root->right, newItem );
    }
}

为什么需要传递TreeNode *&root而不是TreeNode *root

如果传递指针而不是引用指针,则对该指针本身所做的修改将是treeInsert函数的局部treeInsert 这样可以防止您插入根-只有在这种情况下,您必须修改指针本身(源代码中的第三行)。

例如,如果您这样做

TreeNode *root = NULL;
treeInsert(root, "hello");

并且treeInsert采用TreeNode* ,调用treeInsert之后的root值将保持NULL ,因为源代码的第三行将修改root指针的本地副本。

考虑当newItem是根项目时的情况。 然后,这将更改您的根元素。 这意味着在操作结束时,您的注释“ root”必须指向新插入的TreeNode。

现在,如果仅传递TreeNode *root ,则只能更改该值,但是最后,您的根指针无法更改。 因此,您必须按引用传递指针,以便可以在函数中进行更改。

指针TreeNode*由引用传递,因此在树为空的情况下,可以更改调用函数中的原始指针

否则,如果仅传递指针的副本,则修改将在所调用函数的本地进行。

在代码本身中有一个注释: 请注意,根是通过引用传递的,因为在树为空的情况下其值可以更改。

如果不这样做,则调用函数中的NULL指针表示树的根,这显然是错误的,因为您只是插入了一个元素。

处理这种情况的其他方法是:

  1. 返回本地root指针

    root = treeInsert(root, str);

  2. 将指针传递到根指针,因此可以更改它

    treeInsert(&root, str);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM