[英]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
指針表示樹的根,這顯然是錯誤的,因為您只是插入了一個元素。
處理這種情況的其他方法是:
返回本地root
指針
root = treeInsert(root, str);
將指針傳遞到根指針,因此可以更改它
treeInsert(&root, str);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.