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