繁体   English   中英

我应该如何定义一个返回对指针的引用的函数? (引用指针与指向指针的指针)

[英]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);
    //...
}   // <---

n1n2n3使用自动存储,并且在超出范围时(即,当main返回时位于<--- )被破坏。

暂无
暂无

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

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