[英]How should I define a function that return reference to a pointer? (reference to pointer vs pointer to pointer)
我要實現以下功能:刪除二進制搜索樹中某個值的節點。 我想通過兩個步驟來做到這一點:1.找到節點的值2.刪除節點。
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
為了簡化問題,假設要刪除的節點是葉子,因此我們可以直接將其刪除。
我已經實現了搜索功能,該功能將對樹節點的指針的引用返回,因此我可以直接更改樹結構,而無需跟蹤父節點。 但這不起作用(未刪除該節點)。
TreeNode *&searchBST(TreeNode *&root, int val)
{
if (!root)
return root;
if (root->val == val)
return root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
我還實現了搜索功能,該功能將指針返回到treenode的指針,並且可以正常工作。
TreeNode **searchBST(TreeNode *&root, int val)
{
if (!root)
return &root;
if (root->val == val)
return &root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
完整代碼:
#include <iostream>
using namespace std;
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *&searchBST(TreeNode *&root, int val)
{
if (!root)
return root;
if (root->val == val)
return root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode *node = searchBST(root, key);
if (!node)
return root;
node = NULL;
return root;
}
int main()
{
TreeNode n1(1), n2(0), n3(2);
n1.left = &n2;
n1.right = &n3;
TreeNode *res = deleteNode(&n1, 2);
return 0;
}
起作用的代碼:
#include <iostream>
using namespace std;
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode **searchBST(TreeNode *&root, int val)
{
if (!root)
return &root;
if (root->val == val)
return &root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode **node = searchBST(root, key);
if (!node)
return root;
*node = NULL;
return root;
}
int main()
{
TreeNode n1(1), n2(0), n3(2);
n1.left = &n2;
n1.right = &n3;
TreeNode *res = deleteNode(&n1, 2);
if (res->right != NULL)
cout << res->right->val << endl;
return 0;
}
我應該如何定義一個返回對指針的引用的函數?
您編寫TreeNode *&searchBST(TreeNode *&root, int val)
方式很好。 您的問題的前提是錯誤的:使您的工作版本與非工作版本有所不同的不是searchBST
而是deleteNode
。
這里:
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode *node = searchBST(root, key);
if (!node)
return root;
node = NULL;
return root;
}
node
是一個局部變量,為它分配NULL
不會對實際樹產生任何影響。
另一方面,這里:
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode **node = searchBST(root, key);
if (!node)
return root;
*node = NULL;
return root;
}
node
是指向您存儲在樹中的實際指針的指針。 因此,您可以取消引用它以將其分配給樹中的指針。
如何釋放已刪除節點的空間?
你不!
刪除*節點不起作用。
為什么要使用delete
? 您從未使用過new
,因此也不應使用delete
釋放內存。 在主要方面:
int main()
{
TreeNode n1(1), n2(0), n3(2);
//...
} // <---
n1
, n2
和n3
使用自動存儲,並且在超出范圍時(即,當main
返回時位於<---
)被破壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.