簡體   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