递归中的指针未按预期工作

Pointers in recursion not working as expected

我正在尝试插入 BST;

struct Node
{
    Node* left;
    Node* right;
    int data;

    Node(int d)
        :left(nullptr), right(nullptr), data(d)
    {
    }
};


void Insertion(Node* head, int value)
{
    if (!head)
    {
        head = new Node(value);
        return;
    }

    if (head->data > value)
        Insertion(head->left, value);
    else
        Insertion(head->right, value);
}

void printTree(Node* root)
{
    if (!root)
    {
        return;
    }

    cout << root->data << " "; //20 15 10 18 30 35 34 38
    printTree(root->left);
    printTree(root->right);

}

int main()
{
    Node *root = new Node(20);
    Insertion(root, 15);
    Insertion(root, 30);
    Insertion(root, 10);
    Insertion(root, 18);
    Insertion(root, 35);
    Insertion(root, 34);
    Insertion(root, 38);

    printTree(root);

}

我的 Insertion 方法无法正确插入。但是,如果我像下面这样使用它,它就会起作用;

Node* Insertion(Node* head, int value)
{
    if (!head)
    {
        return (new Node(value));   
    }

    if (head->data > value)
        head->left = Insertion(head->left, value);
    else
        head->right = Insertion(head->right, value);

    return head;
}

我不确定 Node* head 是否是我发送的副本,如果是,是否可以在不使用 Node return 类型的情况下创建相同的函数,但是通过通过引用传递 head?

您可以像评论中提到的那样使用对指针的引用,或者您也可以像下面这样使用指向指针的指针:

void Insertion(Node** head, int value)
{
    if (!(*head))
    {
        *head = new Node(value);
        return;
    }

    if ((*head)->data > value)
        Insertion(&(*head)->left, value);
    else
        Insertion(&(*head)->right, value);
}

并像这样调用函数:

Node *root = new Node(20);
Insertion(&root, 15);

在您的代码中,您只是将地址复制到函数参数(指针变量)。在函数内部,您正在为其分配另一个地址。但在这种情况下,这不是您想要的。您需要更改您传递的地址的内容。