0

在 CLRS 中关于二叉搜索树的章节中,我遇到了移植功能,它用在父元素中进行适当更改的节点替换u节点。v这是我为移植功能编写的代码:

void transplant(Node* root, Node* u, Node* v)
{
    if(u->parent == NULL)
        root = v;
    else if(u == u->parent->left)
        u->parent->left = v;
    else
        u->parent->right = v;
    if(v != NULL)
        v->parent = u->parent;
}

并不是我不明白它是如何工作的,而是为什么它会起作用。当我进行函数调用时,我基本上是在向函数发送指针副本,root对吗?所以函数中所做的更改实际上不应该反映在根上,除非我返回它或使用指向指针类型的指针,但它实际上改变了原始根。我将 root 定义为全局变量,这会改变什么吗?uv

4

1 回答 1

0

u->parent如果is ,则该函数将不起作用NULL,在这种情况下,只有局部变量root设置为v,从函数外部访问的任何内容都不会更改。

如果u->parent != NULL, 那么u->parent->leftu->parent->right是 所Node指向的成员u->parent, 并且那些被覆盖, 所以更改在 中是可见的main

于 2012-09-22T14:14:39.303 回答